| ▲ | proc0 4 hours ago | |||||||||||||||||||||||||
Nice breakdown. I've been wondering why it's so complicated to program on the GPU compared to the CPU. Is it a language paradigm issue or maybe a hardware design limitation? I always think of this when looking at the graphic APIs, espeically Vulkan. | ||||||||||||||||||||||||||
| ▲ | modeless 13 minutes ago | parent | next [-] | |||||||||||||||||||||||||
It's mostly hardware design limitations. GPU hardware is way more diverse than CPU hardware, so you need a portable intermediate representation and a runtime shader compiler, and you need to abstract over wildly different behavior in many places, especially (but not exclusively) in older hardware. If you really want to see why all the cruft is there, and how much you could remove if you dropped support for older hardware, look no further than Sebastian Altonen's "No Graphics API" blog post and associated implementation: https://www.sebastianaaltonen.com/blog/no-graphics-api/ | ||||||||||||||||||||||||||
| ▲ | gryn 2 hours ago | parent | prev | next [-] | |||||||||||||||||||||||||
part of the reason is historical cruft & history path dependency. GPUs didn't start as general computing device for parallelism but a device for the specific purpose of accelerating graphics with very specific fixed functions for that job and only that. with time that fixed pipeline became more complex and more configurable, not fixed/more flexible and hacks were in parallel used to make use of it for tasks outside graphics those hacks were later made into something more formal (CUDA/OpenCL). CUDA being the winner (closed source, not really usable on non-nvidia GPUs) between those 2 and nvidia not wanting to open their competitive advantage to the competition for the niche of non gamings uses / scientific computing (and later AI, which became a huge win for nvidia). vulkan came around after as this open thing (based on a previous attempt by AMD called mantle) that's trying to break down the leaky abstractions and the divide between language for graphics & video games and separate language/frameworks for gpu non-graphic computing with the promise of giving more control and more room for squeezing performance from the hardware at the cost of more complexity with the idea that you'll probably build your own abstractions on top of it for your subset of applications. If GPU were from the get go designed as a parallelism tool first and video game tools second the hardware architecture and the language would probably be different than today and simpler (and if the competition between the duopoly didn't sabotage things) don't forget that the drivers for GPUs would until recently get updates to patch specific video games for performance issues (not sure if they still do that ?) | ||||||||||||||||||||||||||
| ||||||||||||||||||||||||||
| ▲ | avaer 3 hours ago | parent | prev | next [-] | |||||||||||||||||||||||||
It's not more complicated, you have things like CUDA which is basically C/C++ that compiles to GPU. But GPUs have thousands of cores, which means if you want any benefit, the smallest data type you must use is something like array[n * 1024], or your GPU is wasted doing nothing. So you must shape your programs into that memory model or you're just wasting your time (and GPU). That's >50% of the problem. | ||||||||||||||||||||||||||
| ||||||||||||||||||||||||||
| ▲ | johnnyanmac 2 hours ago | parent | prev [-] | |||||||||||||||||||||||||
It's partially historical; I'm sure if we redesigned GPGPU today from the ground up, we'd have an entirely different pipeline. And partially due to hardware vendor lock-in; you can't really design an alternative to Vulkan/d3d12 even if you had the skill and drive to do so. But also partly in the fact that the GPU is specialized for certain operations over a CPU. It wants and need to obtain data in a different way from a CPU to maximize throughput. So language constructs are designed around making sure developers stay on this fast path. The complexity can be seen as some intentional gatekeeping to signal that this kind of programming is only for specific kinds of problems. | ||||||||||||||||||||||||||