Is the GPU of the 13″ Retina MacBook Pro too weak?
When Apple can first out with ‘retina’ (high resolution) displays for there Macs the big 15″ notebooks were upgraded first, not the smaller 11″ – 13″ ones. At first you wonder why, as it is probably simpler to build smaller displays with high dpi. But on second thought you realise, that you need a good GPU to drive those displays. So I was quite surprised, that the new 13″ Retina MacBook Pro only comes with an embedded HD4000.
While the Intel HD4000 is ok for small notebooks and appropriate for normal desktop use, it has one problem when it comes to large displays: The shared memory bus with the CPU. An Intel Core i5 3210M as well as the Core i7 3520M (the two options available for the 13″ MBP) have a memory bandwidth of 25.6 GB/s (that’s gigabyte calculated as base 10; ~23.8GiB/s in base 2). The bandwidth is shared between CPU and GPU: the more the HD4000 needs, the less the CPU has to work with. If we want an ideal 60Hz refresh rate, that’s 407 MiB/frame memory transfer budget.
A fullscreen image in 4 byte per pixel RGBA requires 2560 * 1600 * 4 = 15.6 MiB, in RGB 11.7 MiB. If a power user opens up a dozen windows, each covering roughly half the screen (some finder, terminal etc. windows) as well as 3 fullscreen apps and starts exposé (which will force each of them to be rendered), this will require at least 12 * 0.5 * 11.7 MiB + 4 * 11.7 MiB (the additional fullscreen texture is the desktop) = 117 MiB. Note that the windows can be scattered over multiple virtual desktops as all of those are rendered in exposé. This does not even account for bandwidth needed to create real-time renderings of these windows! Also, windows on OSX have rounded corners and shadows so we might have to assuming RGBA (156 MiB in this example)…
High-DPI as implemented by Apple adds another challenge: In the native ‘double resolution’ mode the 2560*1600 display behaves as a super sharp 1280*800 display. This means that the UI elements might be to large for your taste and you want to use more of the pixels available (as you still see the same desktop and windows as on your old 1280*800 Mac but with sharper text, images etc.). For this, you can change the 2x mode down to 1.5x, so the display behaves as a (slightly less sharp) 1920*1200 screen. Sounds great but the implementation has one flaw: To make it simpler to support the new retina displays, applications don’t have to support five different zoom modes, but just two: 1x and 2x (and if they don’t even support 2x, as old apps do, MacOS X will just pixel-double the window). So internally the 1.5x display has to be rendered in twice the virtual resolution: 3840*2400 and is then downscaled to 2560*1600. Each fullscreen window would then consume 26.3 MiB (RGB) / 35.1 MiB (RGBA) – more that twice the memory and bandwidth requirements than needed for the 2x mode… (we can also see here, why the retina MBP have 8GB RAM as a minimum…).
A couple of windows can quickly eat a significant amount of memory bandwidth and reduces what the CPU can work with dramatically. Even worse with an additional external display and/or other zoom modes.
If anyone has access to a retina 13″ or 15″ (forced to use the HD4000 instead of the GeForce), I would be interested in real life experiences of the behaviour of the user interface influenced by memory hungry applications and performance changes of such apps while working with lots of windows.