这是一个简单的程序,在GPU上申请长度为5个int型的buffer,其他什么都没有做。
1 #include "cuda_runtime.h" 2 #include "device_launch_parameters.h" 3 #include <iostream> 4 using namespace std; 5 int main() 6 { 7 int *dev_buf = 0; 8 cudaError_t cudaStatus; 9 cudaStatus = cudaSetDevice(0);//选择GPU 10 if (cudaStatus != cudaSuccess) 11 { 12 cout << "GPU设置错误\n"; 13 goto Error; 14 } 15 cudaStatus = cudaMalloc((void**)&dev_buf, 5 * sizeof(int));//申请空间 16 cudaStatus = cudaDeviceReset();//结束,GPU重置 17 if (cudaStatus != cudaSuccess) 18 { 19 cout<<"GPU重置错误"; 20 return 1; 21 } 22 Error: 23 cudaFree(dev_buf); 24 return 0; 25 }
在调试时,出现了很奇怪的现象,在第10行,cudaStatus 已经等于 cudaSuccess,但单步调试还是进入if后面{}内,但只经过了goto这一行,但却没有转跳。继续单步直接越过15行,到了16行。如果直接把断点设置在15行,启动调试时,断点就自动跳到16行了。然而程序的确给dev_buf分配了显存,程序运行正常。反复尝试发现,程序中第一次出现的cudaMalloc()函数无法命中断点,且对前面语句产生影响,如果程序里再出现一个或多个cudaMalloc,一切单步调试正常。以为是代码与程序不一致,网上找了各种设置,均无效。CUDA版本是7.5,新手,请各位大牛指教。万分感激。