Cuda 平行反对角线';对于';环

Cuda 平行反对角线';对于';环,cuda,Cuda,我有一个N x N的整数方阵(为了方便起见,它以一维数组的形式存储在设备中) 我正在实施一个算法,该算法需要执行以下操作: 在这个正方形中有2N条反对角线。(反对角线是从上边缘到左边缘和从右边缘到下边缘的平行线) 我需要一个2N次迭代的for循环,每次迭代计算一个反对角线,从左上角开始,到右下角结束 在每次迭代中,反对角线中的所有元素必须并行运行 每个反对角线都是基于前一个反对角线的值计算的 那么,我如何在CUDA中为具有此要求的线程编制索引呢?只要我理解,您希望 A 在每次迭代中,内核都会启动

我有一个N x N的整数方阵(为了方便起见,它以一维数组的形式存储在设备中)

我正在实施一个算法,该算法需要执行以下操作:

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

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

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

每个反对角线都是基于前一个反对角线的值计算的


那么,我如何在CUDA中为具有此要求的线程编制索引呢?

只要我理解,您希望

A

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

也许中的代码可以修改为

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);
}
intidivup(constinta,constintb){return(a%b!=0)?(a/b+1):(a/b);};
#定义块大小32
__全局反并行(浮点*d_A,整数步长,整数N){
int i=threadIdx.x+blockIdx.x*blockDim.x;
int j=步骤i;
/*做d_A[i*N+j]的工作*/
}
对于(int step=0;step<2*N-1;step++){
dim3 dimBlock(块大小);
dim3 dimGrid(iDivUp(步骤,dimBlock.x));
反平行(d_A,阶跃,N);
}

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

显示您已经编写的代码。没有人会为你写所有的东西。@JackOLantern:你是在混淆视听吗?我同意这个问题有点混乱,但我觉得他想从左上角的反对角线开始(一个元素,索引0),然后是下一个反对角线(两个元素,索引1和N),然后是下一个(2,N+1,2N),依此类推到右下角。在反对角线中,元素可以并行处理。假设矩阵较大,可能会摊销无效率(块大小与反对角线长度)。然而,我可能误解了,因为存在2N-1反对角线而不是2N。这需要澄清。@Tom我认为你的解释是正确的。我对我以前的评论表示歉意,我现在已经删除了。“好奇号Tom Out,这个问题似乎是一个问题,在英伟达论坛上发表了2008个问题的非常相似的句子,Lorenz Meyer的评论似乎是对这个问题的第一个评论的重新发布:-”杰克劳顿:哇,好抓人!这几乎是一样的,但从5年前开始。。。