RAM is very crucial for Linux performance for couple of reasons:
Caches. Linux runs without free memory for most of the time. If some memory is not used by applications, it is used for caches which speeds things up. So no memory is ever wasted. If applications needs more memory, caches are freed so caches won't ever prevent applications needing more RAM from running. But of course the more your can cache, the better.
Many applications (especially desktop ones) needs a lot of memory to run nowadays. This is no surprise - most desktop systems (or even smartphones) this days have a lot more memory than Rapsberry Pi. For example web browsers even lightweight) will use tens of MB of memory as soon as you open some bigger web site.
Each and every application needs some amount of memory. So the more applications you run, the more memory they use.
So you always want to have as much ARM memory as possible. But GPU has its own needs depending on what features you want from it.
For older RaspberryPi, with 256 MB of RAM, 4 splits are available:
240/16 - The most RAM size ARM can get (240MB) with mimial GPU memory. It's the best for general computing when you don't need 3D graphics or hardware video acceleration. It has enough memory to handle 1920x1200x16bpp framebuffer resolution. While 32bpp is also working, it's not recommended since it leaves very small amount of free memory for GPU.
224/32 - This one is deprecated in favor of 240/16 split. It has 3D
and hardware video decoding build in but since there is not enough
memory to actually use it, there's little point in using it. Unless
you have some problems with 240/16 split or want to use 32bpp
framebuffer at highest resolution. It is possible it will be deleted in the future.
192/64 - You need at least 64MB of GPU split to use hardware video
acceleration or 3D graphics. It may not be enough GPU memory for
hardware accelerated video playback at highest resolution or if you
need a lot of GPU memory for things like textures.
128/128 - The most RAM GPU can get. Use it when you need a lot of
memory for 3D graphic card and hardware accelerated video playback in
high resolution. This split is needed for RaspBMC to work properly or
to play fullHD video content with omxplayer without problems.
New versions of RaspberryPi has 512 MB of RAM. You have 4 additional splits designed for this version:
- 496/16 and 448/64 - like
192/64 split for 256MB respectively but with 256MB more RAM available for ARM. Since GPU has only 16 MB/64MB or RAM, all the limitations from
192/64 still apply.
- 384/128 - Similar to 128/128 split for 256MB - you should get all the graphic chip features but with reasonable amount of ARM memory. This will probably be the most universal split right now.
- 256/256 - Some bonus graphic card memory if you really need it, like for big textures and similar things. While 256MB of ARM memory is bigger than you could possibly have in older RaspberryPis, I don't think this one will be used on many occasions.
New versions of firmware package removes most of
start_*.elf files, leaving only
fixup*.elf files where added). From now on, you don't have to manually choose proper
start_*.file. Instead, you should use
gpu_mem* options in
config.txt file to choose how much memory goes to GPU. The remaining memory will be allocated to ARM. It should be possible to use arbitrary number in the following range for this options:
**512MB of RAM**: 16M-448M
**256MB of RAM**: 16M-192M
While there is no hardcoded split values right now, most of the informations for the rest of this answer should still be valid when you're trying to determine how much memory should be allocated to GPU.
fixup_cd.elf files are cutdown versions of the respective files, only used when
Using one SD card on both 256 and 512 MB version
If you are using one SD card image for different RaspberryPi versions, you can use
gpu_mem_512 options. First one will only be used on 256MB version while second one only on 512MB version of the board.