有返回值的函数

error_code = cudaDeviceReset();

  1. #include<stdio.h>
  2. int main() {
  3. cudaError_t error_code = cudaDeviceReset();
  4. printf("returned error code:%d \n", error_code); // a cudaError_t variable can be regarded as a integer
  5. printf("cudaSuccess:%d, error_code==cudaSuccess:%d \n", cudaSuccess, cudaSuccess==error_code);
  6. if(error_code==cudaSuccess)
  7. {
  8. printf("CUDA API successed!\n");
  9. }
  10. else
  11. {
  12. printf("Error needs to be handled! code:%d \n", error_code);
  13. }
  14. return 0;
  15. }

image.png

获取对应行数和文件名

  1. #include<stdio.h>
  2. int main() {
  3. cudaDeviceProp prop;
  4. int device_id = 0;
  5. printf("\nGet properties from device #%d:\n", device_id);
  6. cudaError_t error_code = cudaGetDeviceProperties(&prop, device_id);
  7. if(error_code==cudaSuccess)
  8. {
  9. printf("CUDA API successed!\n");
  10. }
  11. else if(error_code==cudaErrorInvalidDevice)
  12. {
  13. printf("Invalid Device! code:%d \n", error_code);
  14. }
  15. device_id = 1;
  16. printf("\nGet properties from device #%d:\n", device_id);
  17. error_code = cudaGetDeviceProperties(&prop, device_id); // 这一行有错,没有足够GPU
  18. if(error_code==cudaSuccess)
  19. {
  20. printf("CUDA API successed!\n");
  21. }
  22. else if(error_code==cudaErrorInvalidDevice)
  23. {
  24. printf("Invalid Device! code:%d \n", error_code);
  25. printf("line:%d in %s\n", __LINE__, __FILE__);// 打印行数和文件名
  26. }
  27. device_id = 2;
  28. printf("\nGet properties from device #%d:\n", device_id);
  29. error_code = cudaGetDeviceProperties(&prop, device_id);
  30. if(error_code==cudaSuccess)
  31. {
  32. printf("CUDA API successed!\n");
  33. }
  34. else if(error_code==cudaErrorInvalidDevice)
  35. {
  36. printf("Invalid Device! code:%d \n", error_code);
  37. printf("line:%d in %s\n", __LINE__, __FILE__);
  38. }
  39. return 0;
  40. }

image.png

Kernel 调用无返回值,获取最近一次错误,并且打印提示字符

  1. error_code = cudaGetLastError();
  2. cudaGetErrorString(error_code)
  1. #include<stdio.h>
  2. __global__ void hello(){
  3. printf("*");
  4. }
  5. int main() {
  6. cudaError_t error_code;
  7. hello<<<-1, 1>>>(); // 不可调用-1
  8. error_code = cudaGetLastError();
  9. if(error_code!=cudaSuccess){
  10. printf("\n");
  11. printf("line:%d in %s\n", __LINE__, __FILE__);
  12. printf("Error needs to be handled!\n");
  13. printf("Error code:%d \n", error_code);
  14. printf("Error string:%s \n", cudaGetErrorString(error_code));
  15. }
  16. hello<<<1, 1025>>>(); // 线程数越界
  17. error_code = cudaGetLastError();
  18. if(error_code!=cudaSuccess){
  19. printf("\n");
  20. printf("line:%d in %s\n", __LINE__, __FILE__);
  21. printf("Error needs to be handled!\n");
  22. printf("Error code:%d \n", error_code);
  23. printf("Error string:%s \n", cudaGetErrorString(error_code));
  24. }
  25. error_code = cudaDeviceSynchronize();
  26. if(error_code!=cudaSuccess){
  27. printf("\n");
  28. printf("line:%d in %s\n", __LINE__, __FILE__);
  29. printf("Error needs to be handled!\n");
  30. printf("Error code:%d \n", error_code);
  31. printf("Error string:%s \n", cudaGetErrorString(error_code));
  32. }
  33. error_code = cudaDeviceReset();
  34. if(error_code!=cudaSuccess){
  35. printf("\n");
  36. printf("line:%d in %s\n", __LINE__, __FILE__);
  37. printf("Error needs to be handled!\n");
  38. printf("Error code:%d \n", error_code);
  39. printf("Error string:%s \n", cudaGetErrorString(error_code));
  40. }
  41. return 0;
  42. }

image.pngs

  1. #include<stdio.h>
  2. #define CHECK(X);
  3. { \
  4. cudaError_t error_code=X;; \
  5. error_code = cudaGetLastError(); \
  6. if(error_code!=cudaSuccess){ \
  7. printf("\n"); \
  8. printf("line:%d in %s\n", __LINE__, __FILE__); \
  9. printf("Error needs to be handled!\n"); \
  10. printf("Error code:%d \n", error_code); \
  11. printf("Error string:%s \n", cudaGetErrorString(error_code)); \
  12. } \
  13. }

注意宏定义函数要有换行符

心得:

注意观察,不是直接调用的CHECK kernel 函数,经过查找资料,充分了解,才能正确的实现功能,不能执拗地违背规律。
总之需要详细地调研,才能更好地分析,巧妇难为无米之炊。