使用推力的向量数组

Posted

技术标签:

【中文标题】使用推力的向量数组【英文标题】:Array of vectors using Thrust 【发布时间】:2012-09-06 13:57:23 【问题描述】:

是否可以使用 Thrust 创建一个 device_vectors 数组?我知道我无法创建 device_vector 的 device_vector,但我将如何创建 device_vectors 数组?

【问题讨论】:

虽然您可以在 Thrust 中执行此操作,但不建议这样做。推力仅针对一维向量进行了优化。对于 2 维或更多维数据,还有其他更好的库,例如OpenCV GPU、ArrayFire 等 我会看看 OpenCV GPU。 ArrayFire 对多个 GPU 来说是免费的。 听起来不错。 OpenCV GPU(如 Thrust)比 ArrayFire 慢得多,所以这是你必须做出的权衡。 你能解释一下你想做什么吗?如果你想要一个二维数组,那么 ArrayFire 可能是一个更好的选择。如果您只是出于其他原因希望在主机代码中使用主机端的 device_vectors 数组,那么这很简单。 @harrism 你将如何处理 device_vectors 的主机端数组?我认为这对我有用。它并不是真正的二维数组。虽然 CUDA 可以处理二维数组。 【参考方案1】:

以下代码对我有用。如果将此代码放在扩展名为 .cu 的文件中,则编译良好,但如果将其放在扩展名为 .cpp 的文件中,则会导致编译时断言失败。

thrust::device_vector<float> vectors[3];
//thrust::device_vector<float> *vectors = new thrust::device_vector<float>[3];

vectors[0] = thrust::device_vector<float>(10);
vectors[1] = thrust::device_vector<float>(10);
vectors[2] = thrust::device_vector<float>(10);

printf("Works\n");

断言失败如下

1>../for_each.inl(96) : error C2027: use of undefined type 'thrust::detail::STATIC_ASSERTION_FAILURE<x>'

【讨论】:

谢谢,我自己试试吧! 太棒了!我认为这个问题/答案会帮助很多人! @Manolete,我有时会忘记在 .cu 文件中使用面向设备的推力代码,从而导致一些断言失败。它也可能会提醒我。 有 copy_if 等方法。此外,您可以从 Thrust 容器中获取原始指针。 ***.com/questions/7678995/… 是的。这些向量的大小是在运行时定义的,而不是编译时。所以未知尺寸应该没问题。

以上是关于使用推力的向量数组的主要内容,如果未能解决你的问题,请参考以下文章

推力::设备向量使用推力::替换或推力::转换与自定义函子/谓词

推力::主机向量和标准::向量有啥区别?

推力:基于另一个向量选择性地复制

常量内存中的推力::device_vector

推力——按键排序两个向量

从推力::设备向量到原始指针并返回?