devices.h
2.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#ifndef STIM_CUDA_DEVICES
#define STIM_CUDA_DEVICES
#include <cuda.h>
namespace stim{
extern "C"
int maxThreadsPerBlock(){
int device;
cudaGetDevice(&device); //get the id of the current device
cudaDeviceProp props; //device property structure
cudaGetDeviceProperties(&props, device);
return props.maxThreadsPerBlock;
}
extern "C"
size_t sharedMemPerBlock(){
int device;
cudaGetDevice(&device); //get the id of the current device
cudaDeviceProp props; //device property structure
cudaGetDeviceProperties(&props, device);
return props.sharedMemPerBlock;
}
extern "C"
size_t constMem(){
int device;
cudaGetDevice(&device); //get the id of the current device
cudaDeviceProp props; //device property structure
cudaGetDeviceProperties(&props, device);
return props.totalConstMem;
}
//tests that a given device ID is valid and provides at least the specified compute capability
bool testDevice(int d, int major, int minor){
int nd;
cudaGetDeviceCount(&nd); //get the number of CUDA devices
if(d <= nd && d >= 0) { //if the given ID has an associated device
cudaDeviceProp props;
cudaGetDeviceProperties(&props, d); //get the device properties structure
if(props.major > major){
return true;
}
else if(props.major == major && props.minor >= minor){
return true;
}
}
return false;
}
//tests each device ID in a list and returns the number of devices that fit the desired
// compute capability
int testDevices(int* dlist, unsigned n_devices, int major, int minor){
int valid = 0;
for(int d = 0; d < n_devices; d++){
if(testDevice(dlist[d], major, minor))
valid++;
}
return valid;
}
void printDevice(int device){
int nd;
cudaGetDeviceCount(&nd); //get the number of CUDA devices
printf("CUDA Device Diagnosis: [%i]\n", device);
if(device < 0){
printf("Device %i is an invalid device ID\n", device);
}
else if(device >= nd){
printf("Device %i is unavailable - only %i devices are detected", device, nd);
}
else{
cudaDeviceProp props;
cudaGetDeviceProperties(&props, device); //get the device properties structure
printf("compute capability: %i.%i\n", props.major, props.minor);
}
}
} //end namespace rts
#endif