我试图将2个2D数组、1个1D数组和2个整数传递给cudaMlloc(),以便在内核中使用它。二维数组是双精度的,另一个是整数。而一维数组包含浮点数。我一直得到错误“没有重载函数CudaMalloc的实例与参数列表匹配。参数类型是:(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);
最佳答案
您提到了cudaMalloc
的错误
此行不正确:
int *d_y;
cudaMalloc((void**)d_y,yVarSize);
应该是:
int *d_y;
cudaMalloc((void**)&d_y,yVarSize);
^
add this ampersand
尽管您已经通过
(void **)
强制转换向编译器隐藏了该错误,所以编译器不会标记该错误。不能使用
cudaMalloc
分配这样的二维数组:int** d_data;
cudaMalloc(&d_data,dataFileSize);
double** d_cmatrix;
cudaMalloc(&d_cmatrix,cmatrixSize);
这些将抛出编译器错误,因为
cudaMalloc
需要一个**
参数,而不是***
。建议您将这些数组展平并作为一维数组传递,如果需要,请在内核中执行下标算法以模拟二维数组。如果您真的想学习如何传递二维数组,请搜索CUDA二维数组以获得一些想法。
由于没有提供完整的代码,因此很难说代码中是否有其他错误。