在运行一个cuda核函数之后,内存拷贝的时候抛出了这个错误。当然,cuda是不会主动抛出错误的,需要用下面的代码抓取错误:
cudaError_t error_check101 ;
error_check101 = cudaGetLastError();
if( error_check101 != cudaSuccess ){
cout<<"error when count1!"<<endl;
printf("%s\n" , cudaGetErrorString( error_check101 ) );
}
虽然是在cudaMemcpy的时候报的错,但是错误显然出在前面的核函数。
为了这个错误翻了很多网站,刚开始以为是核函数的线程开的太多,想了一些办法把线程数缩小,但是仍然报错。
后来看到有人说可能是在核函数中尝试访问未声明的内存空间,类似于c++中的segmentation default错误。仔细检查了这个核函数的所有参数,发现有一个指针数组,id最大的一些线程会访问到它未声明的空间。把这个指针数组的声明空间扩大,就不会出错了。
问题解决啦~
这个错误花了我两天多的时间来调,为什么会花这么久呢?因为这个核函数和其他两个核函数一起嵌套在一个for循环里,要定位到这个参数是比较困难的。