我有一个 N x N 整数方阵(为方便起见,它作为一维数组存储在设备中)。
我正在实现一个需要执行以下操作的算法:
这个正方形有 2N 条对角线。(反对角线是从上边缘到左边缘和从右边缘到下边缘的平行线)
我需要一个具有 2N 次迭代的 for 循环,每次迭代计算一个从左上角开始到右下角结束的对角线。
在每次迭代中,该对角线中的所有元素都必须并行运行。
每个对角线都是根据前一个对角线的值计算的。
那么,如何在 CUDA 中索引具有此要求的线程?
我有一个 N x N 整数方阵(为方便起见,它作为一维数组存储在设备中)。
我正在实现一个需要执行以下操作的算法:
这个正方形有 2N 条对角线。(反对角线是从上边缘到左边缘和从右边缘到下边缘的平行线)
我需要一个具有 2N 次迭代的 for 循环,每次迭代计算一个从左上角开始到右下角结束的对角线。
在每次迭代中,该对角线中的所有元素都必须并行运行。
每个对角线都是根据前一个对角线的值计算的。
那么,如何在 CUDA 中索引具有此要求的线程?
只要我明白,你想要类似的东西
使用 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);
}
此代码未经测试,只是可能解决方案的草图(前提是我没有误解您的问题)。此外,我不知道这样的解决方案有多有效,因为您将使用很少的线程启动内核。