目前,我正在尝试在 OpenCL 中进行一些项目,以了解它是如何工作的,以及它如何帮助我更快地进行计算。互联网上的大多数教程都建议应该使用 cl::vector 而不是 std::vector。
为什么?
它们之间有什么区别,为什么 cl::vector 更适合 OpenCL 开发?
OpenCL C++ 规范在第5 节(第 60 页)中提到了这一点:
虽然 C++ 的标准模板库为快速访问许多有用的算法和容器提供了极好的资源,但由于不同工具链和操作系统之间的兼容性问题以及其他原因,它通常不被使用。OpenCL C++ API 在许多地方使用向量和字符串,默认情况下将使用 std::vector 和 std::string,但是,开发人员可以不包括这些。
C++ API 为 std::vector (cl::vector) 和 std::string (cl::string) 提供了替换,或者开发人员可以选择使用他们自己的实现。
因此,这些标准 C++ 类型的各种实现之间似乎存在兼容性问题,因此 OpenCL 提供了自己的类型,这些类型已知可以满足 OpenCL 的需要。
但是请注意,默认情况下 OpenCL 坚持标准 C++ 类型;要使用 cl::vector 和 cl::string 您必须定义宏__NO_STD_VECTOR
和/或__NO_STD_STRING
. 这两种替换类型可能不应该用于非 OpenCL 代码,因为它们提供了减少的功能。示例:根据我的理解,cl::vector 默认限制为 10 个元素,除此之外无法调整大小。在我的 linux 机器上进行的快速测试实际上没有成功 push_back() 超过 10 个元素到 cl::vector 对象。这是非常可怕的。
不幸的是,我找不到更多关于哪些工具链会导致这些问题的详细信息。我才刚刚开始做 OpenCL 工作,所以我还不能从我的经验中说出来。但我会尽量使用标准的 std::vector ,而不是避免使用坏的工具链。
这两个类是相似的。cl::vector
没有实现resize, reserve, insert, erase or swap
(至少在 OpenCL 1.1 中)。因此,如果您需要这些功能之一,则必须使用std::vector
.