我试图将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);
答案 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数组以获得一些想法。
由于您没有提供完整的代码,因此您的代码中是否存在其他错误很难说。