我必须使用float2矩阵作为一维数组。我想检查一些事情,我写了这段代码:
#include <stdio.h>
#include <stdlib.h>
#define index(x,y) x+y*N
__global__ void test(float2* matrix_CUDA,int N)
{
int i,j;
i=blockIdx.x*blockDim.x+threadIdx.x;
j=blockIdx.y*blockDim.y+threadIdx.y;
matrix_CUDA[index(i,j)].x=i;
matrix_CUDA[index(i,j)].y=j;
}
int main()
{
int N=256;
int i,j;
//////////////////////////////////////////
float2* matrix;
matrix=(float2*)malloc(N*N*sizeof(float2));
//////////////////////////////////////////
float2* matrix_CUDA;
cudaMalloc((void**)&matrix_CUDA,N*N*sizeof(float2));
//////////////////////////////////////////
dim3 block_dim(32,2,0);
dim3 grid_dim(2,2,0);
test <<< grid_dim,block_dim >>> (matrix_CUDA,N);
//////////////////////////////////////////
cudaMemcpy(matrix,matrix_CUDA,N*N*sizeof(float2),cudaMemcpyDeviceToHost);
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
printf("%d %d, %f %f\n",i,j,matrix[index(i,j)].x,matrix[index(i,j)].y);
}
}
return 0;
}
我正在等待输出:
0 0, 0 0
0 1, 0 1
0 2, 0 2
0 3, 0 3
...
但我找到的是:
0 0, -nan 7.265723657
0 1, -nan 152345
0 2, 25.2135235 -nan
0 3, 52354.324534 24.52354234523
...
这意味着我在内存分配方面存在一些问题(我想),但我无法找到代码的错误。有人能帮助我吗?
答案 0 :(得分:2)
如果您在使用CUDA代码时出现问题,则应始终使用proper CUDA error checking并使用cuda-memcheck
, 寻求帮助之前运行代码。
即使您不理解输出,对于试图帮助您的其他人也会有所帮助。
如果您使用cuda-memcheck
运行此代码,您可能会获得(在所有其他输出中!)某些输出,如下所示:
$ cuda-memcheck ./t1273
========= CUDA-MEMCHECK
========= Program hit cudaErrorInvalidConfiguration (error 9) due to "invalid configuration argument" on CUDA API call to cudaLaunch.
========= Saved host backtrace up to driver entry point at error
========= Host Frame:/lib64/libcuda.so.1 [0x2eea03]
========= Host Frame:./t1273 [0x3616e]
========= Host Frame:./t1273 [0x2bfd]
========= Host Frame:./t1273 [0x299a]
========= Host Frame:/lib64/libc.so.6 (__libc_start_main + 0xf5) [0x21b15]
========= Host Frame:./t1273 [0x2a5d]
=========
========= ERROR SUMMARY: 1 error
$
这意味着您配置内核启动的方式有问题:
dim3 block_dim(32,2,0);
dim3 grid_dim(2,2,0);
test <<< grid_dim,block_dim >>> (matrix_CUDA,N);
^^^^^^^^^^^^^^^^^^
kernel config arguments
具体来说,在为内核启动创建dim3
变量时,您不会选择零维度。任何组件的最小尺寸为1,而不是零。
所以使用这样的参数:
dim3 block_dim(32,2,1);
dim3 grid_dim(2,2,1);
此外,一旦你解决了这个问题,你仍然会发现代码没有触及你的许多输出。要解决这个问题,您需要增加线程数组的大小以匹配数据数组的大小。由于您有一维数组,因此我不清楚为什么要启动2D线程块和2D网格。您的数据数组应该完全“可以容忍”,线性维度中总共有65536个线程,如下所示:
dim3 block_dim(32,1,1);
dim3 grid_dim(2048,1,1);