我需要执行并行缩减以在CUDA设备上找到数组的最小值或最大值。我为此找到了一个很好的库,名为Thrust。您似乎只能在主机内存中对阵列执行并行缩减。我的数据在设备内存中。是否可以减少设备内存中的数据? 我无法想象如何做到这一点。以下是Thrust的文档:http://code.google.com/p/thrust/wiki/QuickStartGuide#Reductions。谢谢你们所有人。
答案 0 :(得分:7)
您可以减少已经在设备内存中的阵列的推力。您需要做的就是将设备指针包装在thrust::device_pointer
个容器中,然后调用其中一个简化过程,就像您链接到的wiki中所示:
// assume this is a valid device allocation holding N words of data
int * dmem;
// Wrap raw device pointer
thrust::device_ptr<int> dptr(dmem);
// use max_element for reduction
thrust::device_ptr<int> dresptr = thrust::max_element(dptr, dptr+N);
// retrieve result from device (if required)
int max_value = dresptr[0];
请注意,返回值也是device_ptr
,因此您可以使用thrust::raw_pointer_cast
直接在其他内核中使用它:
int * dres = thrust::raw_pointer_cast(dresptr);
答案 1 :(得分:1)
如果推力或任何其他库没有为您提供此类服务,您仍然可以自己创建该内核。
Mark Harris有一篇关于并行缩减及其对cuda优化的精彩教程。 在他的幻灯片之后,根据您的需要实现和修改它并不困难。