【问题标题】:CUDA array elements shifting operationCUDA数组元素移位操作
【发布时间】:2012-05-07 19:32:19
【问题描述】:

我目前正在 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

附言。最后一个元素保持不变,因为它到达了它没有任何东西的边界 用。。。来代替。另外,每一行只会出现一个-1

所以,这基本上是操作,但我的问题是如何为每一行分配一个线程 或者 .. 并行化所有行并在 cuda 中同时进行转换?还有,我的 使用等式将数组从二维数组转换为一维数组

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?移位后右边数值的填写规则是什么?你总是重复最后一个值吗?如果一行中有多个 -1 怎么办?
  • OP 已经澄清 -1 每行只出现一次。该方案似乎是在 -1 之后将所有内容都向左移动,但保留最右边的元素。

标签: arrays cuda shift


【解决方案1】:

这看起来可以通过稍微修改的“流压缩”算法来完成,该算法使用“谓词总和”作为原语。有关详细信息,请参阅以下链接: Parallel Prefix Sum (Scan) with CUDA.

嗯。我可以看到,使用投票函数(将源数据与 -1 进行比较)和一些位算术来确定扭曲线程在执行复制时如何(以及是否)选择目标偏移量也可能有优势。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    • 2021-09-09
    • 2015-08-04
    • 1970-01-01
    • 2011-05-06
    相关资源
    最近更新 更多