并行反对角'for'循环?

时间:2013-10-16 04:26:35

标签: cuda

我有一个N×N的整数矩阵(为方便起见,它作为一维数组存储在设备中)。

我正在实施一项要求执行以下操作的算法:

这个广场上有2N个反对角线。 (反对角线是从上边缘到左边缘和右边缘到下边缘的平行线)

我需要一个2N迭代的for循环,每次迭代计算一个从左上角开始到右下角结束的反对角线。

在每次迭代中,反对角线中的所有元素必须并行运行。

每个反对角线都是根据前一个反对角线的值计算的。

那么,如何在CUDA中使用此要求索引线程?

1 个答案:

答案 0 :(得分:1)

只要我明白,你就想要像

这样的东西

Parallelizing the Smith-Waterman Local Alignment Algorithm using CUDA A

在每次迭代时,都会使用不同数量的线程启动内核。

也许Parallel Anti diagonal 'for' loop中的代码可以修改为

int iDivUp(const int a, const int b) { return (a % b != 0) ? (a / b + 1) : (a / b); };

#define BLOCKSIZE 32

__global__ antiparallel(float* d_A, int step, int N) {

    int i = threadIdx.x + blockIdx.x* blockDim.x;
    int j = step-i;

    /* do work on d_A[i*N+j] */

}

for (int step = 0; step < 2*N-1; step++) {
    dim3 dimBlock(BLOCKSIZE);
    dim3 dimGrid(iDivUp(step,dimBlock.x));
    antiparallel<<<dimGrid.x,dimBlock.x>>>(d_A,step,N);
}

此代码未经测试,只是可能解决方案的草图(前提是我没有误解您的问题)。此外,我不知道这样的解决方案有多高效,因为你将使用非常少的线程启动内核。