1

目前,我正在尝试在 OpenCL 中进行一些项目,以了解它是如何工作的,以及它如何帮助我更快地进行计算。互联网上的大多数教程都建议应该使用 cl::vector 而不是 std::vector。

为什么?

它们之间有什么区别,为什么 cl::vector 更适合 OpenCL 开发?

4

2 回答 2

1

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 ,而不是避免使用坏的工具链。

于 2015-09-29T13:59:10.277 回答
0

这两个类是相似的。cl::vector没有实现resize, reserve, insert, erase or swap(至少在 OpenCL 1.1 中)。因此,如果您需要这些功能之一,则必须使用std::vector.

于 2012-12-22T12:18:27.757 回答