CUDA版本更新很快,但仅限N卡。OpenCL跨平台,社区貌似不太活跃,更新不如CUDA。
OpenMP 主要是针对CPU,最近开始支持GPU了,OpenACC:适合需要快速将CPU代码移植到GPU上的并行计算任务。
CUDA: NVIDIA公司开发的一种并行计算平台和编程模型(平台+API),只支持NVIDIA的GPU。
关键词: 既有平台又是API语言支持: C/C++, Fortran优点:版本更行快,社区活跃, 支持GPU缺点:只支持N卡
OpenCL: 是一个开放的标准,用于跨平台的并行编程,支持CPU,GPU, DSPs, FPGAs 等( NV GPU/Xeon Phi/Intel等品牌都支持)
在多进程方面使用 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(混合并行)。
参考:
https://www.zhihu.com/question/31760994/answer/95977121