【发布时间】:2014-01-13 14:22:36
【问题描述】:
我有一些使用 nVIDIA CUDA 的经验,现在我也在考虑学习 openCL。我希望能够在任何 GPU 上运行我的程序。我的问题是:每个 GPU 是否都使用与 nVIDIA 相同的架构(多处理器、SIMT 结构、全局内存、本地内存、寄存器、缓存等)?
非常感谢!
【问题讨论】:
我有一些使用 nVIDIA CUDA 的经验,现在我也在考虑学习 openCL。我希望能够在任何 GPU 上运行我的程序。我的问题是:每个 GPU 是否都使用与 nVIDIA 相同的架构(多处理器、SIMT 结构、全局内存、本地内存、寄存器、缓存等)?
非常感谢!
【问题讨论】:
从您的既定目标开始:
“我希望能够在任何 GPU 上运行我的程序。”
那么是的,你应该学习 OpenCL。
在回答您的整体问题时,其他 GPU 供应商确实使用与 Nvidia GPU 不同的架构。事实上,来自单一供应商的 GPU 设计可能会有很大差异,具体取决于型号。
这是给定 OpenCL 代码在不同 GPU 之间的性能可能完全不同(取决于您的性能指标)的原因之一。事实上,为了在任何 GPU 上实现优化性能,应该通过改变(例如)本地内存大小来“分析”算法,以便为给定的硬件设计找到最佳算法设置。
但即使存在这些硬件差异,OpenCL 的目标是提供所有设备(CPU、GPU、FPGA 等)都支持的核心功能,并包括允许供应商公开独特硬件功能的“扩展” .尽管 OpenCL 无法隐藏硬件的显着差异,但它确实保证了可移植性。这使开发人员可以更轻松地从针对一种设备调整的 OpenCL 程序开始,然后开发针对另一种架构优化的程序。
为了使识别硬件差异变得复杂,CUDA使用的术语与OpenCL使用的术语不同,例如,以下含义大致相同:
CUDA:OpenCL:
线程工作项 线程块工作组 全局内存 全局内存 恒常记忆恒常记忆 共享内存 本地内存 本地内存 私有内存
更多比较和讨论可以found here。
【讨论】:
您会发现 OpenCL 和 CUDA 提供的抽象类型非常相似。您通常还可以依靠具有类似功能的硬件:全局内存、本地内存、流式多处理器等...
从 CUDA 切换到 OpenCL,您可能会因为许多相同的概念有不同的名称而感到困惑(例如:CUDA "warp" == OpenCL "wavefront")。
【讨论】: