The modern GPU has two usage purposes: 1. For parallel computing 2. For graphics rendering. However, the hardware design patterns for these two purposes are very different and we will suffer from low efficiency if we adopt a general design method for all tasks.
It is interesting to observe the relationship between hardware generalization and specialization. The GPU is first designed specifically for graphics computing which is more natrually parallelized. But later people find GPU could also be used for more general computing tasks and so CUDA and OpenCL are introduced. But GPUs also keeps some graphics-specific recourses.
Is the graphics-specific part completely off-limits for general compute? Could we have used this / did anyone ever use this in assignment 2?
To take advantage of the heterogeneity present in GPUs CUDA actually allows for inter operability with OpenGL that can allow both to share buffers in memory on the GPU as opposed to performing the computation on the GPU and do an expensive memory transfer to the CPU for rendering purposes