104 CUresult result = device_cuda_safe_init();
105 if (result != CUDA_SUCCESS) {
106 if (result != CUDA_ERROR_NO_DEVICE) {
107 fprintf(stderr,
"CUDA cuInit: %s\n", cuewErrorString(result));
113 result = cuDeviceGetCount(&
count);
114 if (result != CUDA_SUCCESS) {
115 fprintf(stderr,
"CUDA cuDeviceGetCount: %s\n", cuewErrorString(result));
121 for (
int num = 0; num <
count; num++) {
124 result = cuDeviceGetName(name, 256, num);
125 if (result != CUDA_SUCCESS) {
126 fprintf(stderr,
"CUDA cuDeviceGetName: %s\n", cuewErrorString(result));
131 cuDeviceGetAttribute(&major, CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MAJOR, num);
133 VLOG_INFO <<
"Ignoring device \"" << name
134 <<
"\", this graphics card is no longer supported.";
151 if (num != peer_num) {
153 cuDeviceCanAccessPeer(&can_access, num, peer_num);
158 int pci_location[3] = {0, 0, 0};
159 cuDeviceGetAttribute(&pci_location[0], CU_DEVICE_ATTRIBUTE_PCI_DOMAIN_ID, num);
160 cuDeviceGetAttribute(&pci_location[1], CU_DEVICE_ATTRIBUTE_PCI_BUS_ID, num);
161 cuDeviceGetAttribute(&pci_location[2], CU_DEVICE_ATTRIBUTE_PCI_DEVICE_ID, num);
164 (
unsigned int)pci_location[0],
165 (
unsigned int)pci_location[1],
166 (
unsigned int)pci_location[2]);
168# if defined(WITH_OPENIMAGEDENOISE)
169# if OIDN_VERSION >= 20300
170 if (oidnIsCUDADeviceSupported(num)) {
172 if (OIDNDenoiserGPU::is_device_supported(info)) {
181 int timeout_attr = 0, preempt_attr = 0;
182 cuDeviceGetAttribute(&timeout_attr, CU_DEVICE_ATTRIBUTE_KERNEL_EXEC_TIMEOUT, num);
183 cuDeviceGetAttribute(&preempt_attr, CU_DEVICE_ATTRIBUTE_COMPUTE_PREEMPTION_SUPPORTED, num);
189 VLOG_INFO <<
"Assuming device has compute preemption on Windows 10.";
193 if (timeout_attr && !preempt_attr) {
194 VLOG_INFO <<
"Device is recognized as display.";
197 display_devices.push_back(info);
200 VLOG_INFO <<
"Device has compute preemption or is not used for display.";
201 devices.push_back(info);
206 VLOG_INFO <<
"Device with id \"" << info.
id <<
"\" supports "
210 if (!display_devices.empty()) {
211 devices.insert(devices.end(), display_devices.begin(), display_devices.end());
221 CUresult result = device_cuda_safe_init();
222 if (result != CUDA_SUCCESS) {
223 if (result != CUDA_ERROR_NO_DEVICE) {
224 return string(
"Error initializing CUDA: ") + cuewErrorString(result);
226 return "No CUDA device found\n";
230 result = cuDeviceGetCount(&
count);
231 if (result != CUDA_SUCCESS) {
232 return string(
"Error getting devices: ") + cuewErrorString(result);
235 string capabilities =
"";
236 for (
int num = 0; num <
count; num++) {
238 if (cuDeviceGetName(name, 256, num) != CUDA_SUCCESS) {
241 capabilities += string(
"\t") + name +
"\n";
243# define GET_ATTR(attr) \
245 if (cuDeviceGetAttribute(&value, CU_DEVICE_ATTRIBUTE_##attr, num) == CUDA_SUCCESS) { \
246 capabilities += string_printf("\t\tCU_DEVICE_ATTRIBUTE_" #attr "\t\t\t%d\n", value); \
253 GET_ATTR(MAX_THREADS_PER_BLOCK);
254 GET_ATTR(MAX_BLOCK_DIM_X);
255 GET_ATTR(MAX_BLOCK_DIM_Y);
256 GET_ATTR(MAX_BLOCK_DIM_Z);
257 GET_ATTR(MAX_GRID_DIM_X);
258 GET_ATTR(MAX_GRID_DIM_Y);
259 GET_ATTR(MAX_GRID_DIM_Z);
260 GET_ATTR(MAX_SHARED_MEMORY_PER_BLOCK);
261 GET_ATTR(SHARED_MEMORY_PER_BLOCK);
262 GET_ATTR(TOTAL_CONSTANT_MEMORY);
265 GET_ATTR(MAX_REGISTERS_PER_BLOCK);
266 GET_ATTR(REGISTERS_PER_BLOCK);
267 GET_ATTR(CLOCK_RATE);
268 GET_ATTR(TEXTURE_ALIGNMENT);
269 GET_ATTR(GPU_OVERLAP);
270 GET_ATTR(MULTIPROCESSOR_COUNT);
271 GET_ATTR(KERNEL_EXEC_TIMEOUT);
272 GET_ATTR(INTEGRATED);
273 GET_ATTR(CAN_MAP_HOST_MEMORY);
274 GET_ATTR(COMPUTE_MODE);
275 GET_ATTR(MAXIMUM_TEXTURE1D_WIDTH);
276 GET_ATTR(MAXIMUM_TEXTURE2D_WIDTH);
277 GET_ATTR(MAXIMUM_TEXTURE2D_HEIGHT);
278 GET_ATTR(MAXIMUM_TEXTURE3D_WIDTH);
279 GET_ATTR(MAXIMUM_TEXTURE3D_HEIGHT);
280 GET_ATTR(MAXIMUM_TEXTURE3D_DEPTH);
281 GET_ATTR(MAXIMUM_TEXTURE2D_LAYERED_WIDTH);
282 GET_ATTR(MAXIMUM_TEXTURE2D_LAYERED_HEIGHT);
283 GET_ATTR(MAXIMUM_TEXTURE2D_LAYERED_LAYERS);
284 GET_ATTR(MAXIMUM_TEXTURE2D_ARRAY_WIDTH);
285 GET_ATTR(MAXIMUM_TEXTURE2D_ARRAY_HEIGHT);
286 GET_ATTR(MAXIMUM_TEXTURE2D_ARRAY_NUMSLICES);
287 GET_ATTR(SURFACE_ALIGNMENT);
288 GET_ATTR(CONCURRENT_KERNELS);
289 GET_ATTR(ECC_ENABLED);
290 GET_ATTR(TCC_DRIVER);
291 GET_ATTR(MEMORY_CLOCK_RATE);
292 GET_ATTR(GLOBAL_MEMORY_BUS_WIDTH);
293 GET_ATTR(L2_CACHE_SIZE);
294 GET_ATTR(MAX_THREADS_PER_MULTIPROCESSOR);
295 GET_ATTR(ASYNC_ENGINE_COUNT);
296 GET_ATTR(UNIFIED_ADDRESSING);
297 GET_ATTR(MAXIMUM_TEXTURE1D_LAYERED_WIDTH);
298 GET_ATTR(MAXIMUM_TEXTURE1D_LAYERED_LAYERS);
299 GET_ATTR(CAN_TEX2D_GATHER);
300 GET_ATTR(MAXIMUM_TEXTURE2D_GATHER_WIDTH);
301 GET_ATTR(MAXIMUM_TEXTURE2D_GATHER_HEIGHT);
302 GET_ATTR(MAXIMUM_TEXTURE3D_WIDTH_ALTERNATE);
303 GET_ATTR(MAXIMUM_TEXTURE3D_HEIGHT_ALTERNATE);
304 GET_ATTR(MAXIMUM_TEXTURE3D_DEPTH_ALTERNATE);
305 GET_ATTR(TEXTURE_PITCH_ALIGNMENT);
306 GET_ATTR(MAXIMUM_TEXTURECUBEMAP_WIDTH);
307 GET_ATTR(MAXIMUM_TEXTURECUBEMAP_LAYERED_WIDTH);
308 GET_ATTR(MAXIMUM_TEXTURECUBEMAP_LAYERED_LAYERS);
309 GET_ATTR(MAXIMUM_SURFACE1D_WIDTH);
310 GET_ATTR(MAXIMUM_SURFACE2D_WIDTH);
311 GET_ATTR(MAXIMUM_SURFACE2D_HEIGHT);
312 GET_ATTR(MAXIMUM_SURFACE3D_WIDTH);
313 GET_ATTR(MAXIMUM_SURFACE3D_HEIGHT);
314 GET_ATTR(MAXIMUM_SURFACE3D_DEPTH);
315 GET_ATTR(MAXIMUM_SURFACE1D_LAYERED_WIDTH);
316 GET_ATTR(MAXIMUM_SURFACE1D_LAYERED_LAYERS);
317 GET_ATTR(MAXIMUM_SURFACE2D_LAYERED_WIDTH);
318 GET_ATTR(MAXIMUM_SURFACE2D_LAYERED_HEIGHT);
319 GET_ATTR(MAXIMUM_SURFACE2D_LAYERED_LAYERS);
320 GET_ATTR(MAXIMUM_SURFACECUBEMAP_WIDTH);
321 GET_ATTR(MAXIMUM_SURFACECUBEMAP_LAYERED_WIDTH);
322 GET_ATTR(MAXIMUM_SURFACECUBEMAP_LAYERED_LAYERS);
323 GET_ATTR(MAXIMUM_TEXTURE1D_LINEAR_WIDTH);
324 GET_ATTR(MAXIMUM_TEXTURE2D_LINEAR_WIDTH);
325 GET_ATTR(MAXIMUM_TEXTURE2D_LINEAR_HEIGHT);
326 GET_ATTR(MAXIMUM_TEXTURE2D_LINEAR_PITCH);
327 GET_ATTR(MAXIMUM_TEXTURE2D_MIPMAPPED_WIDTH);
328 GET_ATTR(MAXIMUM_TEXTURE2D_MIPMAPPED_HEIGHT);
329 GET_ATTR(COMPUTE_CAPABILITY_MAJOR);
330 GET_ATTR(COMPUTE_CAPABILITY_MINOR);
331 GET_ATTR(MAXIMUM_TEXTURE1D_MIPMAPPED_WIDTH);
332 GET_ATTR(STREAM_PRIORITIES_SUPPORTED);
333 GET_ATTR(GLOBAL_L1_CACHE_SUPPORTED);
334 GET_ATTR(LOCAL_L1_CACHE_SUPPORTED);
335 GET_ATTR(MAX_SHARED_MEMORY_PER_MULTIPROCESSOR);
336 GET_ATTR(MAX_REGISTERS_PER_MULTIPROCESSOR);
337 GET_ATTR(MANAGED_MEMORY);
338 GET_ATTR(MULTI_GPU_BOARD);
339 GET_ATTR(MULTI_GPU_BOARD_GROUP_ID);
341 capabilities +=
"\n";