main.cu 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #include <cuda.h>
  2. #include <cuda_runtime.h>
  3. #include <iostream>
  4. static __global__ void debug_kernel(bool* has_debug)
  5. {
  6. // Verify using the return code if we have GPU debug flag enabled
  7. #if defined(__CUDACC__) && defined(__CUDACC_DEBUG__)
  8. *has_debug = true;
  9. #else
  10. *has_debug = false;
  11. #endif
  12. }
  13. int choose_cuda_device()
  14. {
  15. int nDevices = 0;
  16. cudaError_t err = cudaGetDeviceCount(&nDevices);
  17. if (err != cudaSuccess) {
  18. std::cerr << "Failed to retrieve the number of CUDA enabled devices"
  19. << std::endl;
  20. return 1;
  21. }
  22. for (int i = 0; i < nDevices; ++i) {
  23. cudaDeviceProp prop;
  24. cudaError_t err = cudaGetDeviceProperties(&prop, i);
  25. if (err != cudaSuccess) {
  26. std::cerr << "Could not retrieve properties from CUDA device " << i
  27. << std::endl;
  28. return 1;
  29. }
  30. if (prop.major >= 3) {
  31. err = cudaSetDevice(i);
  32. if (err != cudaSuccess) {
  33. std::cout << "Could not select CUDA device " << i << std::endl;
  34. } else {
  35. return 0;
  36. }
  37. }
  38. }
  39. std::cout << "Could not find a CUDA enabled card supporting compute >=3.0"
  40. << std::endl;
  41. return 1;
  42. }
  43. int main(int argc, char** argv)
  44. {
  45. bool* has_debug;
  46. cudaError_t err = cudaMallocManaged(&has_debug, sizeof(bool));
  47. if (err != cudaSuccess) {
  48. std::cerr << "cudaMallocManaged failed:\n"
  49. << " " << cudaGetErrorString(err) << std::endl;
  50. return 1;
  51. }
  52. debug_kernel<<<1, 1>>>(has_debug);
  53. err = cudaDeviceSynchronize();
  54. if (err != cudaSuccess) {
  55. std::cerr << "debug_kernel: kernel launch shouldn't have failed\n"
  56. << "reason:\t" << cudaGetErrorString(err) << std::endl;
  57. return 1;
  58. }
  59. if (*has_debug == false) {
  60. std::cerr << "debug_kernel: kernel not compiled with device debug"
  61. << std::endl;
  62. return 1;
  63. }
  64. return 0;
  65. }