为什么要使用cl::vector

Why should I use cl::vector?

本文关键字:vector cl 为什么      更新时间:2023-10-16

目前,我正在尝试在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机器上进行的一次快速测试实际上无声地未能将超过10个元素推送到cl::vector对象。这太可怕了。

不幸的是,我找不到关于哪些工具链会导致这些问题的更多细节。我刚开始做OpenCL的工作,所以我还不能根据我的经验说话。但我会尽量使用标准std::vector,避免使用糟糕的工具链。

这两个类相似。cl::vector不实现resize, reserve, insert, erase or swap(至少在OpenCL 1.1中)。因此,如果您需要其中一个函数,则必须使用std::vector