macros - Detecta el proveedor de dispositivos OpenCL en el código kernel
(1)
Estoy escribiendo algunas optimizaciones específicas de la plataforma y, aunque soy consciente del hecho de que podría analizar la cadena del proveedor en el código de host y enviarla al kernel usando la opción -D
, es quizás más conveniente detectar al proveedor en el kernel directamente, sin la participación del host (de esa manera es posible optimizar kernels incluso sin acceso al código fuente del host, ...).
Hasta ahora, he encontrado lo siguiente:
#ifdef __NV_CL_C_VERSION
/**
* @def NVIDIA
* @brief defined when compiling on NVIDIA GPUs
*/
#define NVIDIA
#endif // __NV_CL_C_VERSION
#if defined(__WinterPark__) || defined(__BeaverCreek__) || defined(__Turks__) || /
defined(__Caicos__) || defined(__Tahiti__) || defined(__Pitcairn__) || /
defined(__Capeverde__) || defined(__Cayman__) || defined(__Barts__) || /
defined(__Cypress__) || defined(__Juniper__) || defined(__Redwood__) || /
defined(__Cedar__) || defined(__ATI_RV770__) || defined(__ATI_RV730__) || /
defined(__ATI_RV710__) || defined(__Loveland__) || defined(__GPU__) || /
defined(__Hawaii__)
#define AMD
/**
* @def AMD
* @brief defined when compiling on AMD GPUs
* @note This list was originally found at https://github.com/magnumripper/JohnTheRipper/wiki/Predefined-macros-in-OpenCL-(standard-and-proprietary) and copied shamelessly. It is most definitely incomplete and contains the troubling __GPU__.
* @note AMD also defines __CPU__ when compiling for CL_DEVICE_TYPE_CPU.
*/
#endif // ...
Cualquier adicion o correccion? ¿Alguien sabe lo que Intel define?
Acabo de probar AMD Fury X con el driver 1912.5
. Las siguientes tres pruebas imprimen el mensaje:
#ifdef cl_amd_device_attribute_query
#pragma message "here goes AMD"
#endif
#ifdef __GPU__
#pragma message "here goes AMD GPU"
#endif
#ifdef __Fiji__
#pragma message "here goes Fiji AMD"
#endif
Sin embargo, tenga en cuenta que cl_amd_device_attribute_query
no es una buena prueba para un dispositivo AMD, ya que la plataforma AMD también incluye la CPU Intel como dispositivo y le otorga la misma extensión. Gorrón.
Estaba revisando amdocl64.dll
y noté lo siguiente:
-cl-std=CL2.0
#define __clang__ 1
#define __clang_major__ 3
#define __clang_minor__ 6
#define __ENDIAN_LITTLE__ 1
#define __SPIR32 1
#define __SPIR32__ 1
#define __STDC__ 1
#define __STDC_HOSTED__ 1
#define __STDC_VERSION__ 199901L
#define __STDC_UTF_16__ 1
#define __STDC_UTF_32__ 1
#define __OPENCL_C_VERSION__ 200
#define __OPENCL_VERSION__ 200
-Wf,--force_disable_spir
-fno-lib-no-inline
-fno-sc-keep-calls
-fno-enable-dump
-cl-internal-kernel
-cl-std=CL
-cl-std=CL1.2
-just-kernel=
-DFP_FAST_FMAF=1
-DFP_FAST_FMA=1
-cl-denorms-are-zero
cl-kernel-arg-info
-fno-bin-llvmir
-fno-image-support
-mfast-fmaf
-mfast-fma kernel-arg-alignment
Tenga en cuenta que ni __GPU__
o __Fiji__
se encuentran en este dll. De lo contrario, parece un montón de opciones interesantes. Tenga en cuenta que no todos ellos funcionan, algunos de ellos probablemente necesiten un prefijo con -
.