@@ -302,10 +302,50 @@ Error olGetDeviceInfoImplDetail(ol_device_handle_t Device,
302
302
};
303
303
304
304
// These are not implemented by the plugin interface
305
- if (PropName == OL_DEVICE_INFO_PLATFORM)
305
+ switch (PropName) {
306
+ case OL_DEVICE_INFO_PLATFORM:
306
307
return Info.write <void *>(Device->Platform );
307
- if (PropName == OL_DEVICE_INFO_TYPE)
308
+
309
+ case OL_DEVICE_INFO_TYPE:
308
310
return Info.write <ol_device_type_t >(OL_DEVICE_TYPE_GPU);
311
+
312
+ case OL_DEVICE_INFO_SINGLE_FP_CONFIG:
313
+ case OL_DEVICE_INFO_DOUBLE_FP_CONFIG: {
314
+ ol_device_fp_capability_flags_t flags{0 };
315
+ flags |= OL_DEVICE_FP_CAPABILITY_FLAG_CORRECTLY_ROUNDED_DIVIDE_SQRT |
316
+ OL_DEVICE_FP_CAPABILITY_FLAG_ROUND_TO_NEAREST |
317
+ OL_DEVICE_FP_CAPABILITY_FLAG_ROUND_TO_ZERO |
318
+ OL_DEVICE_FP_CAPABILITY_FLAG_ROUND_TO_INF |
319
+ OL_DEVICE_FP_CAPABILITY_FLAG_INF_NAN |
320
+ OL_DEVICE_FP_CAPABILITY_FLAG_DENORM |
321
+ OL_DEVICE_FP_CAPABILITY_FLAG_FMA;
322
+ return Info.write (flags);
323
+ }
324
+
325
+ case OL_DEVICE_INFO_HALF_FP_CONFIG:
326
+ return Info.write <ol_device_fp_capability_flags_t >(0 );
327
+
328
+ case OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_CHAR:
329
+ case OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_SHORT:
330
+ case OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_INT:
331
+ case OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_LONG:
332
+ case OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_FLOAT:
333
+ case OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_DOUBLE:
334
+ return Info.write <uint32_t >(1 );
335
+
336
+ case OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_HALF:
337
+ return Info.write <uint32_t >(0 );
338
+
339
+ // None of the existing plugins specify a limit on a single allocation,
340
+ // so return the global memory size instead
341
+ case OL_DEVICE_INFO_MAX_MEM_ALLOC_SIZE:
342
+ PropName = OL_DEVICE_INFO_GLOBAL_MEM_SIZE;
343
+ break ;
344
+
345
+ default :
346
+ break ;
347
+ }
348
+
309
349
if (PropName >= OL_DEVICE_INFO_LAST)
310
350
return createOffloadError (ErrorCode::INVALID_ENUMERATION,
311
351
" getDeviceInfo enum '%i' is invalid" , PropName);
@@ -316,6 +356,7 @@ Error olGetDeviceInfoImplDetail(ol_device_handle_t Device,
316
356
" plugin did not provide a response for this information" );
317
357
auto Entry = *EntryOpt;
318
358
359
+ // Retrieve properties from the plugin interface
319
360
switch (PropName) {
320
361
case OL_DEVICE_INFO_NAME:
321
362
case OL_DEVICE_INFO_VENDOR:
@@ -327,7 +368,20 @@ Error olGetDeviceInfoImplDetail(ol_device_handle_t Device,
327
368
return Info.writeString (std::get<std::string>(Entry->Value ).c_str ());
328
369
}
329
370
330
- case OL_DEVICE_INFO_MAX_WORK_GROUP_SIZE: {
371
+ case OL_DEVICE_INFO_GLOBAL_MEM_SIZE: {
372
+ // Uint64 values
373
+ if (!std::holds_alternative<uint64_t >(Entry->Value ))
374
+ return makeError (ErrorCode::BACKEND_FAILURE,
375
+ " plugin returned incorrect type" );
376
+ return Info.write (std::get<uint64_t >(Entry->Value ));
377
+ }
378
+
379
+ case OL_DEVICE_INFO_MAX_WORK_GROUP_SIZE:
380
+ case OL_DEVICE_INFO_VENDOR_ID:
381
+ case OL_DEVICE_INFO_NUM_COMPUTE_UNITS:
382
+ case OL_DEVICE_INFO_ADDRESS_BITS:
383
+ case OL_DEVICE_INFO_MAX_CLOCK_FREQUENCY:
384
+ case OL_DEVICE_INFO_MEMORY_CLOCK_RATE: {
331
385
// Uint32 values
332
386
if (!std::holds_alternative<uint64_t >(Entry->Value ))
333
387
return makeError (ErrorCode::BACKEND_FAILURE,
@@ -389,9 +443,40 @@ Error olGetDeviceInfoImplDetailHost(ol_device_handle_t Device,
389
443
case OL_DEVICE_INFO_DRIVER_VERSION:
390
444
return Info.writeString (LLVM_VERSION_STRING);
391
445
case OL_DEVICE_INFO_MAX_WORK_GROUP_SIZE:
392
- return Info.write <uint64_t >(1 );
446
+ return Info.write <uint32_t >(1 );
393
447
case OL_DEVICE_INFO_MAX_WORK_GROUP_SIZE_PER_DIMENSION:
394
448
return Info.write <ol_dimensions_t >(ol_dimensions_t {1 , 1 , 1 });
449
+ case OL_DEVICE_INFO_VENDOR_ID:
450
+ return Info.write <uint32_t >(0 );
451
+ case OL_DEVICE_INFO_NUM_COMPUTE_UNITS:
452
+ return Info.write <uint32_t >(1 );
453
+ case OL_DEVICE_INFO_SINGLE_FP_CONFIG:
454
+ case OL_DEVICE_INFO_DOUBLE_FP_CONFIG:
455
+ return Info.write <ol_device_fp_capability_flags_t >(
456
+ OL_DEVICE_FP_CAPABILITY_FLAG_CORRECTLY_ROUNDED_DIVIDE_SQRT |
457
+ OL_DEVICE_FP_CAPABILITY_FLAG_ROUND_TO_NEAREST |
458
+ OL_DEVICE_FP_CAPABILITY_FLAG_ROUND_TO_ZERO |
459
+ OL_DEVICE_FP_CAPABILITY_FLAG_ROUND_TO_INF |
460
+ OL_DEVICE_FP_CAPABILITY_FLAG_INF_NAN |
461
+ OL_DEVICE_FP_CAPABILITY_FLAG_DENORM | OL_DEVICE_FP_CAPABILITY_FLAG_FMA);
462
+ case OL_DEVICE_INFO_HALF_FP_CONFIG:
463
+ return Info.write <ol_device_fp_capability_flags_t >(0 );
464
+ case OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_CHAR:
465
+ case OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_SHORT:
466
+ case OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_INT:
467
+ case OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_LONG:
468
+ case OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_FLOAT:
469
+ case OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_DOUBLE:
470
+ return Info.write <uint32_t >(1 );
471
+ case OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_HALF:
472
+ return Info.write <uint32_t >(0 );
473
+ case OL_DEVICE_INFO_MAX_CLOCK_FREQUENCY:
474
+ case OL_DEVICE_INFO_MEMORY_CLOCK_RATE:
475
+ case OL_DEVICE_INFO_ADDRESS_BITS:
476
+ return Info.write <uint32_t >(std::numeric_limits<uintptr_t >::digits);
477
+ case OL_DEVICE_INFO_MAX_MEM_ALLOC_SIZE:
478
+ case OL_DEVICE_INFO_GLOBAL_MEM_SIZE:
479
+ return Info.write <uint64_t >(0 );
395
480
default :
396
481
return createOffloadError (ErrorCode::INVALID_ENUMERATION,
397
482
" getDeviceInfo enum '%i' is invalid" , PropName);
0 commit comments