我对nVIDIA CUDA有一些经验,现在我也在考虑学习openCL。我希望能够在任何GPU上运行我的程序。我的问题是:每个GPU都使用与nVIDIA相同的架构(多处理器,SIMT结构,全局内存,本地内存,寄存器,现金......)?
非常感谢!
答案 0 :(得分:5)
从您的既定目标开始:
“我希望能够在任何GPU上运行我的程序。”
然后是的,你应该学习OpenCL。
在回答您的整体问题时,其他GPU供应商确实使用与Nvidia GPU不同的架构。实际上,单个供应商的GPU设计可能会有很大差异,具体取决于型号。
这就是给定OpenCL代码从一个GPU到另一个GPU的性能差异很大(取决于您的性能指标)的一个原因。实际上,为了在任何GPU上实现优化的性能,应该通过改变(例如,本地存储器大小)来“分析”算法,以找到给定硬件设计的最佳算法设置。
但即使存在这些硬件差异,OpenCL的目标是提供所有设备(CPU,GPU,FPGA等)支持的核心功能,并包含“扩展”,允许供应商公开独特的硬件功能。尽管OpenCL无法隐藏硬件上的重大差异,但它确实保证了可移植性。这使得开发人员更容易从为一个设备调整的OpenCL程序开始,然后开发针对另一个体系结构优化的程序。
通过识别硬件差异使问题复杂化,CUDA使用的术语与OpenCL使用的术语不同,例如,以下内容在含义上大致相同:
CUDA: OpenCL:
Thread Work-item Thread block Work-group Global memory Global memory Constant memory Constant memory Shared memory Local memory Local memory Private memory
更多比较和讨论可以是found here。
答案 1 :(得分:0)
您会发现OpenCL和CUDA提供的抽象类型非常相似。您通常也可以依靠具有类似功能的硬件:全局内存,本地内存,流式多处理器等......
从CUDA切换到OpenCL,您可能会对许多相同概念具有不同名称(例如:CUDA“warp”== OpenCL“wavefront”)这一事实感到困惑。