在GPU全局内存中存储选择性元素

时间:2015-12-11 14:53:14

标签: c# cuda parallel-processing cudafy.net

我们正在使用CUDAfy.NET对GPU进行比较。为此,我们传递两个数组,其中一个包含数据,另一个存储结果。 我只想将这些元素存储在满足特定条件的结果数组中。但是阵列最终会出现条件不满足的不需要的条目。 如何从结果数组中过滤掉这些不需要的条目,并将过滤后的数组返回给主函数?

[Cudafy]
public static void Comparisons(GThread thread, int[] a,int[] c, int iter)
{
    int tx = thread.threadIdx.x;
    if(tx < iter)
    {
        if(a[tx] < tolerance)  //tolerance is some user defined number
        {
            c[tx] = a[tx];
        }
    }
}

1 个答案:

答案 0 :(得分:3)

您必须在多个内核传递中执行此操作。

例:
a = [1,2,1,2,1,2]
公差= 2

第一遍:
创建一个数组,其中包含1表示“保留元素”或0表示“丢弃元素”
p = [1,0,1,0,1,0]

第二遍:
在p数组上执行并行前缀和 i = [0,1,1,2,2,3]
(这个主题有很多白皮书)

第三关:
使用a,p和i 每个元素一个线程。
如果p [threadIdx.x]等于1,则将[threadIdx.x]放入c [i [threadIdx.x]]中 (你可以在这里使用共享内存来更好地合写到c数组)

结果数组c将包含[1,1,1]