tdynamically select GPU with most cuda cores - sphere - GPU-based 3D discrete e… | |
git clone git://src.adamsgaard.dk/sphere | |
Log | |
Files | |
Refs | |
LICENSE | |
--- | |
commit cebda4c5601b577b6535bd0f11bdccfd606a76d2 | |
parent 9625b73a6b76e9c4209e05ed4e13acd265290359 | |
Author: Anders Damsgaard <[email protected]> | |
Date: Mon, 30 Jun 2014 10:04:47 +0200 | |
dynamically select GPU with most cuda cores | |
Diffstat: | |
M src/device.cu | 57 +++++++++++++++++++++++++----… | |
1 file changed, 46 insertions(+), 11 deletions(-) | |
--- | |
diff --git a/src/device.cu b/src/device.cu | |
t@@ -25,6 +25,29 @@ | |
#include "raytracer.cuh" | |
#include "navierstokes.cuh" | |
+// Returns the number of cores per streaming multiprocessor, which is | |
+// a function of the device compute capability | |
+int cudaCoresPerSM(int major, int minor) | |
+{ | |
+ if (major == 1) | |
+ return 8; | |
+ else if (major == 2 && minor == 0) | |
+ return 32; | |
+ else if (major == 2 && minor == 1) | |
+ return 48; | |
+ else if (major == 3 && minor == 0) | |
+ return 192; | |
+ else if (major == 3 && minor == 5) | |
+ return 192; | |
+ else if (major == 5 && minor == 0) | |
+ return 128; | |
+ else | |
+ printf("Error in cudaCoresPerSM", | |
+ "Device compute capability value (%d.%d) not recognized.", | |
+ major, minor); | |
+ return -1; | |
+} | |
+ | |
// Wrapper function for initializing the CUDA components. | |
// Called from main.cpp | |
__host__ void DEM::initializeGPU(void) | |
t@@ -58,22 +81,34 @@ __host__ void DEM::initializeGPU(void) | |
<< " CUDA compatible devices.\n"; | |
} | |
- cudaGetDeviceProperties(&prop, cudadevice); | |
- cudaDriverGetVersion(&cudaDriverVersion); | |
- cudaRuntimeGetVersion(&cudaRuntimeVersion); | |
+ // Loop through GPU's and choose the one with the most CUDA cores | |
+ int ncudacores; | |
+ int max_ncudacores = 0; | |
+ for (int d=0; d<deviceCount; d++) { | |
+ cudaGetDeviceProperties(&prop, d); | |
+ cudaDriverGetVersion(&cudaDriverVersion); | |
+ cudaRuntimeGetVersion(&cudaRuntimeVersion); | |
+ | |
+ ncudacores = prop.multiProcessorCount*cudaCoresPerSM(prop.major, prop.… | |
+ if (ncudacores > max_ncudacores) { | |
+ max_ncudacores = ncudacores; | |
+ cudadevice = d; | |
+ } | |
- if (verbose == 1) { | |
- cout << " Using CUDA device ID: " << cudadevice << "\n"; | |
- cout << " - Name: " << prop.name << ", compute capability: " | |
- << prop.major << "." << prop.minor << ".\n"; | |
- cout << " - CUDA Driver version: " << cudaDriverVersion/1000 | |
- << "." << cudaDriverVersion%100 | |
- << ", runtime version " << cudaRuntimeVersion/1000 << "." | |
- << cudaRuntimeVersion%100 << std::endl; | |
+ if (verbose == 1) { | |
+ cout << " CUDA device ID: " << d << "\n"; | |
+ cout << " - Name: " << prop.name << ", compute capability: " | |
+ << prop.major << "." << prop.minor << ".\n"; | |
+ cout << " - CUDA Driver version: " << cudaDriverVersion/1000 | |
+ << "." << cudaDriverVersion%100 | |
+ << ", runtime version " << cudaRuntimeVersion/1000 << "." | |
+ << cudaRuntimeVersion%100 << std::endl; | |
+ } | |
} | |
// Comment following line when using a system only containing exclusive mo… | |
// GPUs | |
+ cout << " Using CUDA device ID " << cudadevice << '.' << std::endl; | |
cudaChooseDevice(&cudadevice, &prop); | |
checkForCudaErrors("While initializing CUDA device"); |