ero stufo con il download di diversi GB OpenCL SDK di Intel, Nvidia e AMD con diversi problemi:
- Intel richiede la registrazione e ha una licenza temporanea.
- Nvidia SDK non supporta OpenCL 2.0 e devi comunque scaricare cl.hpp.
- AMD Il file
cl.hpp
definisce le macro min e max che possono entrare in conflitto con le macro min e max di MSVC (dedico troppo tempo a capire come risolvere il problema con ad esempio NOMINMAX
). L'intestazione non è uguale a quella definita da Khronos (che non ha il problema min/max).
Pertanto, ho scaricato il codice sorgente e include da Khronos come suggerito da questo SO answer e compilato il OpenCL.lib
il file stesso. I file include e OpenCL.lib sono un paio di MB. È molto più piccolo di tutte le cose extra negli SDK Intel/Nvidia/AMD! Posso includere i file OpenCL include e OpenCL.lib nel mio progetto e non devo più dire agli altri di scaricare un SDK.
La include per OpenCL 2.0 da Khronos registry ha un nuovo file di bind C++ cl2.hpp
. Guardando questo file ho determinato che il modo corretto per supportare le funzioni deprecate con OpenCL 2.0 è qualcosa del genere.
#define CL_HPP_MINIMUM_OPENCL_VERSION 110
#define CL_HPP_TARGET_OPENCL_VERSION 120
#define CL_HPP_CL_1_2_DEFAULT_BUILD
#include "CL/cl2.hpp"
Questo perché il file cl2.hpp ha questo codice
#if CL_HPP_MINIMUM_OPENCL_VERSION <= 100 && !defined(CL_USE_DEPRECATED_OPENCL_1_0_APIS)
# define CL_USE_DEPRECATED_OPENCL_1_0_APIS
#endif
#if CL_HPP_MINIMUM_OPENCL_VERSION <= 110 && !defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
# define CL_USE_DEPRECATED_OPENCL_1_1_APIS
#endif
#if CL_HPP_MINIMUM_OPENCL_VERSION <= 120 && !defined(CL_USE_DEPRECATED_OPENCL_1_2_APIS)
# define CL_USE_DEPRECATED_OPENCL_1_2_APIS
#endif
#if CL_HPP_MINIMUM_OPENCL_VERSION <= 200 && !defined(CL_USE_DEPRECATED_OPENCL_2_0_APIS)
# define CL_USE_DEPRECATED_OPENCL_2_0_APIS
#endif
Si noti che non è più necessario (e non deve) includere più <CL/opencl.h>
.
Infine, dopo #include "CL/cl2.hpp"
al fine di ottenere il mio codice per lavorare con Boost/Compute ho dovuto aggiungere
#undef CL_VERSION_2_0
mio codice OpenCL funziona senza questo, ma Boost/Calcola non lo fa. It appears I'm not the only one having this issue. La mia GPU non supporta OpenCL 2.0.
fonte
2015-10-08 14:00:25
Ho avuto lo stesso problema e ho appena usato l'intestazione 1.1. Copialo nella directory cuda/include/CL e lascialo lì per sempre. Sembra che Nvidia non supporterà mai OpenCL 1.2. Stranamente le intestazioni 1.1 funzionano per me senza avvertimenti. Centos 6.2 con gcc 4.8.1. –