目前我正在尝试在OpenCL中开展一些项目,以了解它是如何工作的,以及它如何帮助我更快地进行计算。互联网上的大多数教程都建议人们应该使用cl :: vector而不是std :: vector。
为什么呢?
它们之间的差异以及为什么cl :: vector更适合OpenCL开发?
答案 0 :(得分:1)
OpenCL C++ specs在第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,而不是使用坏的工具链。
答案 1 :(得分:0)
两个类都很相似。 cl::vector
未实现resize, reserve, insert, erase or swap
(至少在OpenCL 1.1中)。
因此,如果您需要其中一个功能,则必须使用std::vector
。