-
Notifications
You must be signed in to change notification settings - Fork 3
/
nvidia_gpu_stats.cu
159 lines (132 loc) · 5.84 KB
/
nvidia_gpu_stats.cu
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
// ================================================================================================
// A simple script to get memory usage & properties of CUDA supported NVIDIA devices
//
// Author: Sivagnanam Namasivayamurthy
//
// ================================================================================================
#include <stdio.h>
#include <time.h>
// CUDA C headers
#include <cuda.h>
#include <cuda_runtime.h>
/*
*
*/
void printCurrentTime(){
time_t t = time(NULL);
struct tm tm = *localtime(&t);
printf("\n%d-%d-%d %d:%d:%d", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
}
/*
* Get number of CUDA supported devices available
*
* returns: the number of CUDA supported devices
*/
int getCudaDevicesCount(){
int deviceCount;
cudaError_t cu_err = cudaGetDeviceCount(&deviceCount);
if(cudaSuccess != cu_err){
printf("Unable to get cudaGetDeviceCount : error num %d - %s\n", (int) cu_err, cudaGetErrorString(cu_err));
exit(EXIT_FAILURE);
}
return deviceCount;
}
/*
* Print the number of CUDA supported devices available
*/
void printDevicesCount(){
int deviceCount = getCudaDevicesCount();
if(0 == deviceCount){
printf("No CUDA supported device(s) found !!! \n");
exit(EXIT_FAILURE);
} else {
printf("Found %d CUDA supported device(s)\n", deviceCount);
}
}
/*
* Get device properties
*
* deviceId : ID of the CUDA supported device
* returns: the cudaDeviceProp struct that contains the CUDA device properties
*/
cudaDeviceProp getCudaDeviceProps(int deviceId){
cudaDeviceProp deviceProps;
cudaError_t cu_err = cudaGetDeviceProperties(&deviceProps, deviceId);
if(cudaSuccess != cu_err){
printf("Unable to get cudaGetDeviceProperties for device ID %d : error num %d - %s\n", deviceId, (int) cu_err, cudaGetErrorString(cu_err));
exit(EXIT_FAILURE);
}
return deviceProps;
}
/*
* Print the CUDA device properties
*
* deviceId: ID of the CUDA supported device
*/
void printCudaDeviceProps(int deviceId)
{
cudaDeviceProp deviceProps = getCudaDeviceProps(deviceId);
printf("\n Device ID: %d Name: %s\n", deviceId, deviceProps.name);
printf("--------------------------------------------------------------\n");
printf("CUDA capability Major/Minor version number: %d.%d\n", deviceProps.major, deviceProps.minor);
printf("Total global memory: %0.f MB\n", (float)deviceProps.totalGlobalMem/(1048576.0f));
printf("Total shared memory per block: %lu bytes\n", deviceProps.sharedMemPerBlock);
printf("Total registers per block: %d\n", deviceProps.regsPerBlock);
printf("Warp size: %d\n", deviceProps.warpSize);
printf("Maximum memory pitch: %lu bytes\n", deviceProps.memPitch);
printf("Maximum threads per block: %d\n", deviceProps.maxThreadsPerBlock);
printf("Maximum sizes of each dimension of a block: %d x %d x %d \n", deviceProps.maxThreadsDim[0], deviceProps.maxThreadsDim[1], deviceProps.maxThreadsDim[2]);
printf("Maximum sizes of each dimension of a grid: %d x %d x %d \n", deviceProps.maxGridSize[0], deviceProps.maxGridSize[1], deviceProps.maxGridSize[2]);
printf("Clock rate: %d\n", deviceProps.clockRate);
printf("Total constant memory: %lu\n", deviceProps.totalConstMem);
printf("Texture alignment: %lu bytes\n", deviceProps.textureAlignment);
printf("Concurrent copy and execution: %s\n", (deviceProps.deviceOverlap ? "Yes" : "No"));
printf("Number of multiprocessors: %d\n", deviceProps.multiProcessorCount);
printf("Kernel execution timeout: %s\n", (deviceProps.kernelExecTimeoutEnabled ? "Yes" : "No"));
printf("--------------------------------------------------------------\n");
}
/*
* Find all CUDA supported devices & print their properties
*/
void printAllCudaDeviceProps(){
int deviceCount = getCudaDevicesCount();
printCurrentTime();
printf("\nFound %d CUDA supported device(s)\n", deviceCount);
for (int deviceId = 0; deviceId < deviceCount; ++deviceId){
printCudaDeviceProps(deviceId);
}
}
/*
* Print the free & used memory information of all NVIDIA CUDA supported devices
*/
void printNvidiaDevicesMemoryInfo(){
int driverVersion, runTimeVersion, deviceCount;
size_t mem_available, mem_free;
cudaDriverGetVersion(&driverVersion);
cudaRuntimeGetVersion(&runTimeVersion);
deviceCount = getCudaDevicesCount();
printCurrentTime();
printf("\n+----------------------------------------------------------------------+\n");
printf("| CUDA Driver version: %d.%d Runtime Version: %d.%d |\n", driverVersion/1000, (driverVersion % 100)/10, runTimeVersion/1000, (runTimeVersion%100)/10);
for (int deviceId = 0; deviceId < deviceCount; ++deviceId){
cudaSetDevice(deviceId);
cudaDeviceProp deviceProps = getCudaDeviceProps(deviceId);
cudaMemGetInfo(&mem_free, &mem_available);
printf("+----------------------------------------------------------------------------------------+\n");
printf("| Device ID: %d Name: %s %.0f MB (free) / %.0f MB (total) |\n", deviceId, deviceProps.name, (float)mem_free/(1024*1024.), (float)mem_available/(1024*1024.));
printf("+----------------------------------------------------------------------------------------+\n");
}
}
int main(int argc, char *argv[])
{
if(argc < 2) {
printNvidiaDevicesMemoryInfo(); // Print memory information if not argument is passed
} else {
if (0 == strcmp(argv[1], "-mem")){
printNvidiaDevicesMemoryInfo();
} else if (0 == strcmp(argv[1], "-props")) {
printAllCudaDeviceProps();
}
}
return 0;
}