2013-10-16 11 views
6

Sto scrivendo un piccolo programma OpenCL di Hello World utilizzando lo cl.hpp di Khronos Group per OpenCL 1.2 e le librerie openCL di nVidia. I driver e ICD I supportano OpenCL 1.1. Dal momento che il lato nVidia non supporta ancora 1.2, ottengo alcuni errori sulle funzioni richieste su OpenCL 1.2.Impossibile compilare l'applicazione OpenCL utilizzando 1,2 intestazioni nella versione 1.1

Dall'altro lato, cl.hpp per OpenCL 1.2 ha un flag, CL_VERSION_1_1 per la precisione, per eseguire l'intestazione in modalità 1.1, ma non funziona. Qualcuno ha esperienza o soluzione simile?

Nota: cl.hpp per la versione 1.1 funziona, ma genera molti avvisi durante la compilazione. Questo è il motivo per cui sto provando ad usare la versione 1.2.

+0

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. –

risposta

1

Sembra che l'unico modo sia utilizzare le intestazioni di OpenCL 1.1 mentre si lavora con dispositivi compatibili 1.1.

+2

La mia reazione: vabbè, peccato per i proprietari di schede nVidia. Preferirei usare una tecnologia aperta, portatile e ben compresa come OpenCL piuttosto che una struttura proprietaria senza uscita, come CUDA. – Thomas

6

È possibile definire la bandiera CL_USE_DEPRECATED_OPENCL_1_1_APIS che renderà compatibile il file 1.2 hpp 1.1.

#define CL_USE_DEPRECATED_OPENCL_1_1_APIS 

Questo è ciò che ho fatto su NVIDIA e AMD. Funziona come un fascino

+0

Lo proverò appena arrivo sul mio altro computer, dove si trova la fonte. L'errore di compilazione riguardava 'clRetainDevice'and' clReleaseDevice', che sono entrambe funzioni relative a OpenCL 1.2. Quando ho analizzato il codice, sembra che possano essere disabilitati con 'CL_VERSION_1_1', ma proverò anche con la bandiera suggerita. – bayindirh

+0

Purtroppo no, l'impostazione del flag non ha impedito l'intestazione provare a collegarsi a 'clRetainDevice()' e 'clReleaseDevice()'. Lo indagherò ulteriormente però. – bayindirh

7

Sfortunatamente NVIDIA distribuisce una vecchia versione di OpenCL ICD (la libreria che invia chiamate API al driver appropriato). I vostri migliori opzioni sono a uno

  • entrare in possesso di una più fino alla versione data del ICD (se si sta utilizzando Linux, questo è libOpenCL.so, e si può trovare una nuova copia in AMD APP SDK) . Il rovescio della medaglia è che se si distribuisce il codice compilato, sarà necessario anche l'ICD 1.2.
  • Utilizzare i file di intestazione di OpenCL 1.1, ad eccezione del fatto che è possibile utilizzare l'ultimo cl.hpp. Dovrebbe (in teoria) rilevare che è stato combinato con le intestazioni di OpenCL 1.1 e disabilitare tutto il codice OpenCL 1.2 (che però non viene testato molto). Il vantaggio di usare l'ultimo cl.hpp è che ci sono molte correzioni di bug che non vengono ripristinate nella versione 1.1 di cl.hpp.
  • Si può fare questo:

    #include <CL/cl.h> 
    #undef CL_VERSION_1_2 
    #include <CL/cl.hpp> 
    

    ho appena implementato che nel mio codice e sembra fare il trucco.

+0

Hai ancora bisogno di definire CL_USE_DEPRECATED_OPENCL_1_1_APIS come nella risposta di Erik. –

+1

È un peccato che nVIDIA stia cercando di uccidere OpenCL così disperato, invece di dare un supporto adeguato. Ad esempio, ora i loro strumenti non hanno nemmeno il profilo o il registro dei kernel OpenCL ... – DarkZeros

+0

Funziona! Nvidia è molto silenzioso e non ha nulla da dire su OpenCL. Intel va con il supporto GPU OpenCL a MSWIndows. Sfortuna per loro! AMD con supporto OpenCL 2.0 è una tecnologia molto promettente sotto Linux, anche se non ho ancora ricevuto nessuna delle loro carte. – 42n4

1

È possibile chiamare in grado di impostare le opzioni di clBuildProgram come segue

const char options[] = "-cl-std=CL1.1"; 

clBuildProgram(program, 1, &devices, options, NULL, NULL); 

In questo modo il compilatore di utilizzare OpenCL 1.1 non la versione importa è supportata dal dispositivo

4

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.

+0

sicuramente dare un'occhiata. Molte grazie! – bayindirh

+2

È bello vedere qualcuno che sta affrontando questo ostacolo come un uomo! –

Problemi correlati