On stackoverflow, I asked the same question I'm about to ask now. There are commentaries on the question that gives information.
What are the differences between OpenMP, OpenACC, OpenCL, SIMD, and MIMD? Also, in which cases each library is more suited for?
What I currently know :
- OpenCL and CUDA are for GPU programming. They take advantage of the fact that GPUs have a lot of cores.
- CUDA is proprietary to NVIDIA and only works on its GPUs, whilst OpenCL is multiplatform.
- OpenMP is for CPU wise parallelism.
- OpenACC also seems to be for CPU task parallelism.
- SIMD is for executing an operation on multiple cores (CPU only?).
- MIMD seems to be for executing multiple operations on multiple cores (CPU only?).
What I aim to learn here is which libraries are best suited for optimizing an algorithm on the CPU & GPU. Hopefully, I would like to use only one library to do both.