使用cuda生成redheffer矩阵
generating redheffer matrix using cuda
我的作业要求我使用 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);
我有验证输出是否正确的代码,当计算的矩阵元素值不正确时,它会出现 return 错误消息。
当我 运行 我的程序时,我得到这个错误。
GPU number 0 is assigned to this job
Row 0 column 5000 is incorrect. Should be:1 Is actually: 0
我计算值的逻辑是
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);
第一个内核配置参数应该是 grid 的尺寸,以块数表示(在本例中为 x 和 y)。您的第一个内核配置参数是 dimGrid
,您已将其定义为 dim3(BLOCK_WIDTH,BLOCK_WIDTH)
数量,即 16x16 块。我不认为这不是你想要的,但实际上并不违法。
您的第二个内核配置参数应该是 块 的维度,以线程数表示(在本例中为 x 和 y)。您的第二个内核参数是 dimBlocks
,您已将其定义为 dim3(20000/16, 20000/16)
个数量,即 1250x1250 个线程。这是非法的,因为 CUDA 线程块被限制为 总数 1024 个线程,即维度的乘积不能超过 1024。
所以你的内核启动是非法的,你的内核甚至没有 运行ning。如果您将 proper cuda error checking and/or 运行 代码与 cuda-memcheck
一起使用,您会发现这一点。
修复可能相当简单 - 反转您对这些配置参数的看法:
dim3 dimBlock(BLOCK_WIDTH,BLOCK_WIDTH,1);
dim3 dimGrid(numBlocks,numBlocks,1);
同样,我不能说这是唯一的问题,因为您没有显示我可以实际测试的完整代码(这样的问题 expects。)
如果您进行了上述更改但仍然无法正常工作,我建议如下:
添加正确的 cuda 错误检查和 运行 您的代码 cuda-memcheck
正如我已经建议的那样。
提供一个complete MCVE,即其他人可以复制、粘贴和运行的完整代码。还要提供 cuda-memcheck
的输出和系统上的错误检查。
你应该做以上两件事然后你在这里寻求调试帮助。
我的作业要求我使用 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);
我有验证输出是否正确的代码,当计算的矩阵元素值不正确时,它会出现 return 错误消息。 当我 运行 我的程序时,我得到这个错误。
GPU number 0 is assigned to this job
Row 0 column 5000 is incorrect. Should be:1 Is actually: 0
我计算值的逻辑是
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);
第一个内核配置参数应该是 grid 的尺寸,以块数表示(在本例中为 x 和 y)。您的第一个内核配置参数是 dimGrid
,您已将其定义为 dim3(BLOCK_WIDTH,BLOCK_WIDTH)
数量,即 16x16 块。我不认为这不是你想要的,但实际上并不违法。
您的第二个内核配置参数应该是 块 的维度,以线程数表示(在本例中为 x 和 y)。您的第二个内核参数是 dimBlocks
,您已将其定义为 dim3(20000/16, 20000/16)
个数量,即 1250x1250 个线程。这是非法的,因为 CUDA 线程块被限制为 总数 1024 个线程,即维度的乘积不能超过 1024。
所以你的内核启动是非法的,你的内核甚至没有 运行ning。如果您将 proper cuda error checking and/or 运行 代码与 cuda-memcheck
一起使用,您会发现这一点。
修复可能相当简单 - 反转您对这些配置参数的看法:
dim3 dimBlock(BLOCK_WIDTH,BLOCK_WIDTH,1);
dim3 dimGrid(numBlocks,numBlocks,1);
同样,我不能说这是唯一的问题,因为您没有显示我可以实际测试的完整代码(这样的问题 expects。)
如果您进行了上述更改但仍然无法正常工作,我建议如下:
添加正确的 cuda 错误检查和 运行 您的代码
cuda-memcheck
正如我已经建议的那样。提供一个complete MCVE,即其他人可以复制、粘贴和运行的完整代码。还要提供
cuda-memcheck
的输出和系统上的错误检查。
你应该做以上两件事然后你在这里寻求调试帮助。