一个运行时的问题

运行时出现这个 invalid argument in MCCUDA.cu at line 357(无效的参数在357行)可这几行附近是这样的语句实在看不出错误!求牛人解决?

355 // Allocate x and a on the device
356HANDLE_ERROR(cudaMalloc((void**)&dev_x,NUM_THREADSsizeof(unsigned long long)));
357 HANDLE_ERROR(cudaMemcpy(dev_x,x,NUM_THREADS
sizeof(unsigned long long),cudaMemcpyHostToDevice));
358
359 HANDLE_ERROR(cudaMalloc((void**)&dev_a,NUM_THREADSsizeof(unsigned int)));
360HANDLE_ERROR(cudaMemcpy(dev_a,a,NUM_THREADS
sizeof(unsigned int),cudaMemcpyHostToDevice));

我不是牛人,但是我尽量指出您可能存在问题的最常见的情况.

当您的cudaMemcpy的第二个参数x,
(1)是无效指针的时候(例如NULL, 您忘记了分配)。
(2)是有效的指针,但cudaMemcpy()在使用该指针指向的内存的过程中,遇到了access violation.

1和2情况可能是最符合您的问题的情况了。

我演示了2个代码,均可能会导致此错误:

错误反例A:
int *d = NULL; cudaMalloc(&d, 4);
int *h = NULL;
cudaMemcpy(d,h,4,cudaMemcpyHostToDevice); //出错,“invalid argument"

错误反例B:
int *d = NULL; cudaMalloc(&d, 1048576);
int h = (int)malloc(104857);
cudaMemcpy(d,h,1048576,cudaMemcpyHostToDevice); //出错,“invalid argument"

根据您给出的信息,该2种情况是您最大的可能。但不排除其他会员/版主/NV技术支持给出其他存在的可能的解释。

建议您排查上述2种情况。

此外,对于这2种情况,他们在cudaMemcpy内部作为异常被捕获,并转换为相应的返回值。您可以检查debug output窗口中是否存在调试器的first-chance exception提示。如果存在,则加大了您可能是上述2种情况的概率。