用cuda生成redheffer矩阵

用cuda生成redheffer矩阵,cuda,gpu,Cuda,Gpu,我有一项任务要求我使用Cuda在GPU上生成Redheffer矩阵 A Redheffer matrix1 is a matrix where each entry a[i][j] is defined by a[i][j] = 1 if j = 1, 1 if j is divisible by i 0 otherwise. 这是我的密码 #define SIZE = 20000 #define BLOCK_WIDTH 16 /* Launch th

我有一项任务要求我使用Cuda在GPU上生成Redheffer矩阵

A Redheffer matrix1 is a matrix where each entry a[i][j] is defined by  
a[i][j] =  
1 if j = 1,   
1 if j is divisible by i  
0 otherwise.
这是我的密码

    #define SIZE = 20000
    #define BLOCK_WIDTH 16

   /* Launch the CUDA kernel */
    int numBlocks = ceil(SIZE / BLOCK_WIDTH);
    dim3 dimGrid(BLOCK_WIDTH,BLOCK_WIDTH,1);
    dim3 dimBlock(numBlocks,numBlocks,1);
    redhefferMatrix<<<dimGrid, dimBlock>>>(d_M, SIZE);
我计算值的逻辑是

int Row= blockIdx.y*blockDim.y + threadIdx.y;
int Col= blockIdx.x*blockDim.x + threadIdx.x;
.
.
if(i < 20000 && j < 20000)
{   

    {

        if(j == 1 || j % i == 0)
            d_M[i*SIZE+ j] = 1;
        else
            d_M[i*SIZE+ j] = 0;
    }
}
int Row=blockIdx.y*blockDim.y+threadIdx.y;
int Col=blockIdx.x*blockDim.x+threadIdx.x;
.
.
如果(i<20000和&j<20000)
{   
{
如果(j==1 | | j%i==0)
d_M[i*SIZE+j]=1;
其他的
d_M[i*SIZE+j]=0;
}
}

有人能告诉我哪里可能是错的吗。提前感谢。

由于您尚未提供完整的代码,因此无法确定可能存在的所有问题。但您对块和轴网尺寸有误解(将其颠倒):

同样,我不能说这是唯一的问题,因为您还没有展示一个我可以实际测试的完整代码(对于这样的问题也是如此)

如果您进行了上述更改,但事情仍然不起作用,我建议您:

  • 添加正确的cuda错误检查,并按照我之前的建议,使用
    cuda memcheck
    运行代码

  • 提供一个,即其他人可以复制、粘贴和运行的完整代码。还提供系统上的
    cuda memcheck
    输出和错误检查


  • 在这里请求调试帮助之前,您应该完成以上两件事。

    因为您没有提供完整的代码,所以无法确定可能存在的所有问题。但您对块和轴网尺寸有误解(将其颠倒):

    同样,我不能说这是唯一的问题,因为您还没有展示一个我可以实际测试的完整代码(对于这样的问题也是如此)

    如果您进行了上述更改,但事情仍然不起作用,我建议您:

  • 添加正确的cuda错误检查,并按照我之前的建议,使用
    cuda memcheck
    运行代码

  • 提供一个,即其他人可以复制、粘贴和运行的完整代码。还提供系统上的
    cuda memcheck
    输出和错误检查


  • 在这里请求调试帮助之前,您应该完成以上两件事。

    谢谢您的解释。这很有帮助,谢谢你的解释。这有帮助。
    int Row= blockIdx.y*blockDim.y + threadIdx.y;
    int Col= blockIdx.x*blockDim.x + threadIdx.x;
    .
    .
    if(i < 20000 && j < 20000)
    {   
    
        {
    
            if(j == 1 || j % i == 0)
                d_M[i*SIZE+ j] = 1;
            else
                d_M[i*SIZE+ j] = 0;
        }
    }
    
    #define SIZE = 20000
    #define BLOCK_WIDTH 16
    
    /* Launch the CUDA kernel */
    int numBlocks = ceil(SIZE / BLOCK_WIDTH);
    dim3 dimGrid(BLOCK_WIDTH,BLOCK_WIDTH,1);
    dim3 dimBlock(numBlocks,numBlocks,1);
    redhefferMatrix<<<dimGrid, dimBlock>>>(d_M, SIZE);
    
    dim3 dimBlock(BLOCK_WIDTH,BLOCK_WIDTH,1);
    dim3 dimGrid(numBlocks,numBlocks,1);