通过设备中的阵列并行减少CUDA

时间:2012-04-12 13:25:39

标签: cuda thrust reduction

我需要执行并行缩减以在CUDA设备上找到数组的最小值或最大值。我为此找到了一个很好的库,名为Thrust。您似乎只能在主机内存中对阵列执行并行缩减。我的数据在设备内存中。是否可以减少设备内存中的数据? 我无法想象如何做到这一点。以下是Thrust的文档:http://code.google.com/p/thrust/wiki/QuickStartGuide#Reductions。谢谢你们所有人。

2 个答案:

答案 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优化的精彩教程。 在他的幻灯片之后,根据您的需要实现和修改它并不困难。