Cuda,在尝试为设备中的整数分配内存时出错

时间:2014-10-06 19:08:44

标签: c arrays cuda gpu-programming

我试图将2个2D数组,1个1D数组和2个整数传递给cudaMlloc(),以便我可以在我的内核中使用它。 2D数组是双精度数,其他数组是int。而1d数组包含浮点数。我一直得到错误“没有重载函数的实例CudaMalloc匹配参数list.argument类型是:(int,int)。我不知道我做错了什么。 内核和我使用它的方式如下:

__global__ void getMatrix(double** cmatrix,int** data,float* angle,int x,int y){

int j = blockIdx.x * blockDim.x + threadIdx.x;
int i = blockIdx.y * blockDim.y + threadIdx.y;

int xrad,yrad;
xrad = 0;
yrad = 0;

xrad = (int)round(cos(angle[i]) * (j+1) + x);   
yrad = (int)round(sin(angle[i]) * (j+1) + y);   

cmatrix[i][j] = (double)data[yrad-1][xrad-1];

}

实施是:

int dataFileSize = 801 * 1201 * sizeof(int);
int cmatrixSize = ANGLESIZE * RADIUS/RADSTEP * sizeof(double);
int xVarSize = sizeof(int);
int yVarSize = sizeof(int);

int** d_data;
cudaMalloc(&d_data,dataFileSize);

double** d_cmatrix;
cudaMalloc(&d_cmatrix,cmatrixSize);

float * d_angle;
cudaMalloc(&d_angle,sizeof(float) * ANGLESIZE);

int *d_x;
cudaMalloc((void**)&d_x,xVarSize);
int *d_y;
cudaMalloc((void**)d_y,yVarSize);

cudaMemcpy(d_data,data,dataFileSize,cudaMemcpyHostToDevice);
cudaMemcpy(d_cmatrix,cmatrix,cmatrixSize,cudaMemcpyHostToDevice);
cudaMemcpy(d_angle,angle,sizeof(float) * ANGLESIZE,cudaMemcpyHostToDevice);
cudaMemcpy(d_x,&x,xVarSize,cudaMemcpyHostToDevice);
cudaMemcpy(d_y,&y,yVarSize,cudaMemcpyHostToDevice);         

const dim3 blockSize(ANGLESIZE,1,1);
const dim3 threadSize(1,RADIUS/RADSTEP,1);

getMatrix<<<blockSize,threadSize>>>(d_cmatrix,d_data,d_angle,d_x,d_y);

cudaMemcpy(cmatrix,d_cmatrix,cmatrixSize,cudaMemcpyDeviceToHost);

cudaFree(d_data);
cudaFree(d_cmatrix);
cudaFree(d_angle);
cudaFree(d_x);  
cudaFree(d_y);

1 个答案:

答案 0 :(得分:3)

您提到了cudaMalloc

的错误

这一行不正确:

int *d_y;
cudaMalloc((void**)d_y,yVarSize);

它应该是:

int *d_y;
cudaMalloc((void**)&d_y,yVarSize);
                   ^
                   add this ampersand

虽然您已经通过(void **)强制转换隐藏了编译器的错误,但这不是编译器标记的错误。

您不能使用cudaMalloc分配这样的2D数组:

int** d_data;
cudaMalloc(&d_data,dataFileSize);

double** d_cmatrix;
cudaMalloc(&d_cmatrix,cmatrixSize);

这会抛出编译器错误,因为cudaMalloc需要**参数,而不是***

建议您将这些数组展平并将它们作为一维数组传递,如果需要,在内核中执行下标算法来模拟2D。如果您真的想学习如何传递2D数组,请搜索CUDA 2D数组以获得一些想法。

由于您没有提供完整的代码,因此您的代码中是否存在其他错误很难说。

相关问题