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

08-05 05:26