CUDA数组元素移位操作

时间:2012-04-27 02:36:07

标签: arrays cuda shift

我目前正在CUDA上执行数组移位操作,但我陷入了需要在GPU上并行操作的部分(我已经为CPU做过)。因此,该操作基本上是在数组中移动元素。

因此,例如,如果我有一个M×N矩阵,如果我看到-1,则每行都会替换 -1与元素旁边,依此类推,直到我到达行的末尾,然后我 需要对所有列并行执行此操作。

这是一个简单的例子:

 3  4  1 -1  5  6  7  8
-1  4  5  2  1  2  5  2
 2  4  5  1  2  3  4 -1

对于该矩阵,得到的矩阵将是:

 3  4  1  5  6  7  8  8
 4  5  2  1  2  5  2  2
 2  4  5  1  2  3  4 -1

PS。最后一个元素保持不变,因为它击中了它没有任何东西的边界    用。。。来代替。此外,每行只会出现一个

所以,这基本上就是操作,但我的问题是如何为每一行分配一个线程 或者..并行化所有行并在cuda中同时进行这种移动?还有,我的 使用等式

将数组从2d数组转换为1d数组
array1d[i+width*j]  =  array2d[i][j];

到目前为止,我已经尝试过这个:

__global__ void gpu_shiftArray(int *Arr, int *location, int width, int height)
{
int i = blockIdx.x * blockDim.x + threadIdx.x;
int j = blockIdx.y * blockDim.y + threadIdx.y;

int index = i+width*j;

//shift when I see -1
if(Arr[index] == -1)
{
    Arr[index] = (index % height) ? Arr[index+1] : 
    }
    //location stores the index of -1, so anything after the -1 will be shifted too
if((location[i]+width*j) <= index)
{
    Arr[index] = (index % height) ? Arr[index+1] : 
}
}

它的输出不完全正确(由5-10个值关闭),但我不完全确定 为什么我也不知道我做错了什么。

1 个答案:

答案 0 :(得分:1)

这看起来可以通过稍微修改的“流压缩”算法来完成,该算法使用“谓词和”作为基元。请参阅以下链接了解详细信息: http://http.developer.nvidia.com/GPUGems3/gpugems3_ch39.html

嗯。我可以看到使用选票函数(将源数据与-1进行比较)和一些比例用于确定经线如何(以及如果)在复制时选择目标偏移量也是有利的。