CUDA版本更新很快,但仅限N卡。OpenCL跨平台,社区貌似不太活跃,更新不如CUDA。
OpenMP 主要是针对CPU,最近开始支持GPU了,OpenACC:适合需要快速将CPU代码移植到GPU上的并行计算任务。
- CUDA: NVIDIA公司开发的一种并行计算平台和编程模型(平台+API),只支持NVIDIA的GPU。
-
- 关键词: 既有平台又是API
- 语言支持: C/C++, Fortran
- 优点:版本更行快,社区活跃, 支持GPU
- 缺点:只支持N卡
在多进程方面使用 task-based 和 data-based parallelism。
-
- 关键词: 平台 + API
- 语言支持: C/C++
- 优点: 跨好多平台啊
- 缺点:版本更新慢
- OpenMP: 主要是针对CPU,多线程的并行计算使用。(OpenMP委员会已经增加了GPU offloading的支持,适用于NVIDIA和AMD的GPU)
-
- 关键词: API
- 语言支持: C/C++, Fortran
- 优点:移植改动少,支持普遍(普通的gcc都支持)
- 缺点:只支持shared memory
- OpenACC: 支持CPU/GPU工作,从名字Accelerator就可以推断出,主要用于CPU代码向GPU的移植(?有待考证,我在课程中主要是这么用的。。。),更新方面其实也不快,需要注意编程技巧,否则代码会变慢。
-
- 关键词: API
- 语言支持: C/C++, Fortran
- 优点: 移植简单
- 缺点: 编译器啊,支持PGI,看计划有支持GCC,但还不知道什么时候才能发布
是一个类似于OpenMP的编程接口,专门为加速器(如GPU)设计。它通过使用编译制导语句来简化并行计算的编程工作,让开发者能够更容易地将计算任务迁移到加速器上执行。OpenACC的目标是降低使用加速器进行高性能计算的技术门槛,使非专家也能有效地利用这些资源。
- OpenMPI: 不是并行库,是支持分布式存储,适合大规模集群服务器。另外,需要手动管理数据的分布和消息的传递,需要重新修改代码。
对比总结
框架 | 硬件支持 | 编程语言 | 并行模型 | 优点 | 缺点 |
CUDA | NVIDIA GPU | C/C++/Python | SIMT(线程网格) | 高性能、生态完善 | 仅限 NVIDIA |
OpenCL | CPU/GPU/FPGA/DSP | C/C++ | 任务+数据并行 | 跨平台、灵活 | 优化困难、生态弱 |
OpenMP | CPU(+GPU Offload) | C/C++/Fortran | 共享内存并行 | 简单、编译器支持广 | GPU 支持较新 |
OpenACC | CPU/GPU | C/C++/Fortran | 指令集加速 | 移植简单 | 性能依赖编译器 |
如何选择?
- 深度学习 / NVIDIA GPU 优化 → CUDA(PyTorch/TensorFlow 底层)。
- 跨平台 GPU/FPGA 计算 → OpenCL(但生态不如 CUDA)。
- CPU 多核并行 → OpenMP(最简单)。
- 快速迁移 CPU 代码到 GPU → OpenACC(适合科学计算)。
- 超算 / 分布式计算 → OpenMPI + OpenMP/CUDA(混合并行)。
参考: