为什么要使用cl::vector
Why should I use cl::vector?
目前,我正在尝试在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
。
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中用vector填充一个简单的动态数组
- vector.resize()中的分配错误
- 使用std::vector的OpenCL矩阵乘法
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 在某些循环内使用vector.push_back时出现分段错误
- 当vector是tje全局变量时,c++中vector的内存管理
- std::vector的包装器,使数组的结构看起来像结构的数组
- 当我编译webrtc服务器时,Windows上只支持clang-cl
- 为什么(-1)%vector::size()总是返回0
- 在C++中将类(带有Vector成员)保存为二进制文件
- 编译器如何区分std::vector的构造函数
- 将 int 数组转换为 std::vector<int*>
- 使用 pqxx 将 std::vector 存储在 postgresql 中,并从数据库中检索它
- 在std::vector上存储带有模板的类实例
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 为什么std::vector比数组慢
- std::vector::迭代器是否可以合法地作为指针
- 为什么要使用cl::vector