-3

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

我正在实现一个需要执行以下操作的算法:

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

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

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

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

那么,如何在 CUDA 中索引具有此要求的线程?

4

1 回答 1

1

只要我明白,你想要类似的东西

使用 CUDA A并行化 Smith-Waterman 局部对齐算法

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

也许并行反对角“for”循环中的代码可以修改为

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);
}

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

于 2013-10-16T14:00:29.270 回答