bnieuwen
Furthermore note there is a difference between SoC package power and power pulled from the wall. That depends on the rest of the device, but 5-10W isn't unreasonable. (So e.g. at 22W package power, pulling ~32W from battery is pretty common). Looking at the detailed graph in the NUC review, that difference is particularly large though, the package only pulls <20W in steady state and maybe 30W at boost[0], but this device somehow seems to have significant power draw coming from somewhere else, this is pretty atypical wrt laptops & battery draw at least.
I'm not sure what performance per clock advantage going from desktop to mobile you're referring to? The mobile chips are slower due to the lower max boost and power limits, but due to non-linear power scaling it tends to be not that* much worse than the desktop parts.
As an aside I find the Anandtech Zen3 review[1] a pretty good resource when I want to have a clue about reasonable clock/power expectations on zen3 (though it is only a single workload)
(Also not sure where the 52W claim comes from, my searching on the linked page seems to yield no results?)
*: With the notable exception that pre-6000 series AMD had some horrible delay clocking up the cores when on battery, hitting short tests like geekbench. That said even on AC the chips should be adhering to configured power limits.
[0] https://images.anandtech.com/doci/16236/wm-aida_power.png [1] https://www.anandtech.com/show/16214/amd-zen-3-ryzen-deep-di...
(Note that this is SoC package power instead of the full laptop though, but that is pretty typical, so no idea what the 22W was for comparison.)
The former gets done in process (using e.g. GL/vulkan) and then that final image gets passed onto the windowing system which is a separate process and could run outside the container.
As an aside, with accelerated graphics you mostly pass a file descriptor to the GPU memory containing the image, rather than mucking around with traditional shared memory.
So version management becomes a major pita, from shipping drivers too old to support the hardware to having a driver that doesn't match the kernel. In the cloud this is mostly solved by using VMs and hardware with SR-IOV. (and a fixed HW vendor so you know which set of drivers to include)
Typically the application wants to draw stuff on the GPU. To do this it calls into the GPU driver, which builds a big memory buffer in some implementation-defined format that instructs the GPU what to do, and then the driver instructs the GPU to execute that.
However, applications these days want to do some of the work to determine which commands to do on the GPU (e.g. culling).
So the work here is to allow the application to create a memory buffer on the GPU with commands using a standardized format and then the driver has to convert that into the implementation-defined format on the GPU. This copies a lot of the complexity of the driver from the CPU to something running on the GPU.
If I dig into the .text segment of the optimized executable, only 235 bytes belong to the main function (others are stuff like __libc_csu_init and register_tm_clones). Looking at the assembly the loop would be about 123 bytes.
So lots of overhead, but I wouldn't say it is in the nested loop.