Browse Source

Tests/Cuda: Select a CUDA device supporting compute 3.0

Pierre Moreau 8 years ago
parent
commit
166b339387
2 changed files with 46 additions and 0 deletions
  1. 40 0
      Tests/Cuda/Complex/dynamic.cu
  2. 6 0
      Tests/Cuda/Complex/main.cpp

+ 40 - 0
Tests/Cuda/Complex/dynamic.cu

@@ -22,6 +22,46 @@ void DetermineIfValidCudaDevice()
 {
 }
 
+EXPORT int choose_cuda_device()
+{
+  int nDevices = 0;
+  cudaError_t err = cudaGetDeviceCount(&nDevices);
+  if (err != cudaSuccess)
+    {
+    std::cerr << "Failed to retrieve the number of CUDA enabled devices"
+              << std::endl;
+    return 1;
+    }
+  for (int i = 0; i < nDevices; ++i)
+    {
+    cudaDeviceProp prop;
+    cudaError_t err = cudaGetDeviceProperties(&prop, i);
+    if (err != cudaSuccess)
+      {
+      std::cerr << "Could not retrieve properties from CUDA device " << i
+                << std::endl;
+      return 1;
+      }
+    if (prop.major >= 4)
+      {
+        err = cudaSetDevice(i);
+        if (err != cudaSuccess)
+          {
+          std::cout << "Could not select CUDA device " << i << std::endl;
+          }
+        else
+          {
+            return 0;
+          }
+      }
+    }
+
+  std::cout << "Could not find a CUDA enabled card supporting compute >=3.0"
+            << std::endl;
+
+  return 1;
+}
+
 EXPORT void cuda_dynamic_lib_func()
 {
   DetermineIfValidCudaDevice <<<1,1>>> ();

+ 6 - 0
Tests/Cuda/Complex/main.cpp

@@ -9,11 +9,17 @@
 #define IMPORT
 #endif
 
+IMPORT int choose_cuda_device();
 IMPORT int call_cuda_seperable_code(int x);
 IMPORT int mixed_launch_kernel(int x);
 
 int main(int argc, char** argv)
 {
+  int ret = choose_cuda_device();
+  if (ret) {
+    return 0;
+  }
+
   int r1 = call_cuda_seperable_code(42);
   int r2 = mixed_launch_kernel(42);
   return (r1 == 42 || r2 == 42) ? 1 : 0;