>cudamemcpy2d 返回错误 -- 以下是代码在下面的代码中,我提到了出现错误的行。请看一看,帮助我。
main(){
int nrow = 16,ncol = 41;
//
double **x = new double*[nrow];
double **y = new double*[nrow];
for(int i=0; i<nrow; i++){
x[i] = new double[ncol];
y[i] = new double[ncol];
}
// both x and y are filled with some values and function is called;
function(x,y, nrow, ncol);
}
void function(double **x, double **y, int nrow, ncol){
double *dev_x, *dev_y;
size_t pitch_x, pitch_y;
cudaMallocPitch((void **) &dev_x, &pitch_x, (n_col*sizeof(double)), nrow);
cudaMallocPitch((void **) &dev_y, &pitch_y, (n_col*sizeof(double)), nrow);
// this below line is returning error invalid value
cudaMemcpy2D((void *)dev_x, pitch_x, (void *) *x, sizeof(double)*ncol, sizeof(double)*ncol, nrow, cudaMemcpyDeviceToHost);
//launch a kernel
kernel<<< 1, 1>>>(dev_x, dev_y, nrow, ncol);
//below also gives the same error..
cudaMemcpy2D((void *) *x, sizeof(double)*ncol, dev_x, pitch_x, sizeof(double)*ncol, nrow, cudaMemcpyHostToDevice);
}
请帮忙谢谢
你的方向颠倒了。 第一个cudaMemcpy2D
操作是从主机复制到设备,您应该指定cudaMemcpyHostToDevice
。
同样,第二个cudaMemcpy2D
是朝另一个方向发展(基于您传递的指针顺序),因此应指定cudaMemcpyDeviceToHost
。
传递给cudaMemcpy2D
的第一个指针是目标指针。
您对*d_IntPts_X
的使用也可能是一个问题。 通常你应该将单个指针(*
)扁平化的一维数组传递给cudaMemcpy类型的操作。 但是由于您尚未显示该变量/指针的定义,因此我不能肯定地说。
编辑:现在您已经更改了参数,您不能在 cudaMemcpy2D 中以这种方式使用 x
数组。 相反,将x展平为一维数组,可能是这样的:
double *flat_x = new double[nrow*ncol];
并在您的cudaMemcpy2D
通话中使用它。
此外,CUDA 标签上还有很多这样的问题。 在问"为什么"之前,请搜索并阅读其中的一些内容。 "它不处理2D矩阵吗?"如果我真的想使用2D矩阵怎么办?"等等。