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