main.cu 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #include <iostream>
  2. #include "cuda.h"
  3. #ifdef _WIN32
  4. # define IMPORT __declspec(dllimport)
  5. #else
  6. # define IMPORT
  7. #endif
  8. #ifndef _WIN32
  9. IMPORT int file1_launch_kernel(int x);
  10. #endif
  11. IMPORT int file2_launch_kernel(int x);
  12. int choose_cuda_device()
  13. {
  14. int nDevices = 0;
  15. cudaError_t err = cudaGetDeviceCount(&nDevices);
  16. if (err != cudaSuccess) {
  17. std::cerr << "Failed to retrieve the number of CUDA enabled devices"
  18. << std::endl;
  19. return 1;
  20. }
  21. for (int i = 0; i < nDevices; ++i) {
  22. cudaDeviceProp prop;
  23. cudaError_t err = cudaGetDeviceProperties(&prop, i);
  24. if (err != cudaSuccess) {
  25. std::cerr << "Could not retrieve properties from CUDA device " << i
  26. << std::endl;
  27. return 1;
  28. }
  29. std::cout << "prop.major: " << prop.major << std::endl;
  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. int ret = choose_cuda_device();
  46. if (ret) {
  47. return 0;
  48. }
  49. cudaError_t err;
  50. #ifndef _WIN32
  51. file1_launch_kernel(1);
  52. err = cudaGetLastError();
  53. if (err != cudaSuccess) {
  54. std::cerr << "file1_launch_kernel: kernel launch should have passed.\n "
  55. "Error message: "
  56. << cudaGetErrorString(err) << std::endl;
  57. return 1;
  58. }
  59. #endif
  60. file2_launch_kernel(1);
  61. err = cudaGetLastError();
  62. if (err != cudaSuccess) {
  63. std::cerr << "file2_launch_kernel: kernel launch should have passed.\n "
  64. "Error message: "
  65. << cudaGetErrorString(err) << std::endl;
  66. return 1;
  67. }
  68. return 0;
  69. }