My methodology is probably much more primitive than you might think 🙂 I am not aware of any way to query the GPU frequency, and the GPU power consumption counter is neither informative nor high resolution, so I simply looked at the output of the Metal trace profiler. There is an indicator that shows the GPU performance state (low, medium, high). The moment a kernel starts executing, the GPU goes into the “medium” state, and it takes it about 10ms to go into the “high” state. I will try to investigate how long it stays in the “high” state after the work is completed, not sure whether the profiler will give me this information.
I don’t think it’s strange if you consider that M1 aims to be efficient. It would be wasteful to trigger the high performance mode every time the GPU to render a button, so their solution to keep the clocks low as long as there is no urgent work seems like a reasonable strategy. 10ms is brief enough to appear instantaneous to human perception, and it you can do the work within that period of time - great! If not, we’ll, time to gather those performance reserves.
In other words, you probably don’t care whether your image filter application takes 10ms or 1ms - both is quicker than the button press animation. But you probably care whether it takes 10 seconds or 40 seconds.
In the end, the only class of applications that “suffers” from this style of power management are benchmarks. Abs that’s why benchmarks should include a warmup phase to make sure that they are measuring the correct thing.
I appreciate you doing the bechmark-- this seems to support that this is an architectural decision, not a badly written benchmark.
I don't like to ask other people to put in work for satisfying my curiosity, but, um, 😇, if you find yourself also curious, it might be interesting to see if this behavior changes with the "high power" energy mode in the Battery syspref.
Now the remaining question is whether the benchmark is meaningful. I'd emphatically say yes. Look what the benchmark, and the testing you've done as a result of it, has already taught us in this thread about how the M1 series is optimized and the tradeoffs it presents. The M1 isn't designed to use the GPU as what I'd call a coprocessor, it's meant to be used as what I'd call a processing engine. The Geekbench workload looks they're using something like OpenCV or something to accelerate highly parallel operations-- things that are more than you'd run through Neon, but not infinite workloads. That's what I'd consider a coprocessor. I need a stereo disparity or Canny image, or whatever, so I put the images out to the GPU and get a result back. Then I take the next image pair and send that. Processing each operation are much less than 10ms, but if done on the CPU would severly limit my execution time.
You seem focused on what I'd consider a processing engine-- it just keeps running, endlessly rendering or training a neural net, or simulating the weather all in one dispatch or, if we find it doesn't spin down after each call, a series of very lengthy dispatches.
What these results are saying is that the M1Ultra might double the performance of the M1Max if used as an engine, but will not if used as a coprocessor.
The Unified memory offers two benefits to the GPU: it gives the GPU access to much larger pools of memory (good for an engine) and it avoids memory to memory transfer costs from CPU to GPU (good for coprocessors). That second benefit is not fully realized with the Apple approach.
I'm also curious why the race to sleep paradigm is not seen as beneficial in this context. For dice this enormous, and process geometries this small, I'd have thought being able to power down large portions of the logic would be important to constraining leakage. Better to sweat hard, but leak half as long-- but maybe my assumptions on leakage versus voltage scaling are wrong here.
These are user-facing devices, not server farms. Some milliseconds of warm-up phase are not going to be noticeable.
I see that argument for iPhone, but not a high performance desktop like this. The Ultra is meant to compute, not provide better UX... If the milliseconds of spin up are recurring, it impedes the system's ability to compute.