2011-09-12 12 views
9

C'è un modo per utilizzare i puntatori di funzioni in stile C in OpenCL?La funzione opencl supporta i puntatori alle funzioni?

In altre parole, mi piacerebbe compilare una struttura OpenCL con diversi valori, nonché i puntatori a una funzione OpenCL. Non sto parlando di passare da una funzione CPU a una funzione GPU, sto parlando di passare da una funzione GPU a una funzione GPU.

È possibile?

--- EDIT ---

In caso contrario, c'è un modo per aggirare questo? In CUDA abbiamo ereditarietà di oggetti e in 4.0 abbiamo persino funzioni virtuali. Circa l'unico modo che posso trovare per implementare una distribuzione runtime come questa è ricorrere alle istruzioni if, e questo diventerà brutto molto velocemente.

+1

Per quanto ne so, la risposta è no. Proverò a scavare un riferimento – Flexo

risposta

11

Dal OpenCL 1.1 specification:

Sezione 6.8 (Restrizioni) (a):

L'uso di puntatori è un po 'limitato. Si applicano le seguenti regole:

  • Argomenti kernel funzioni dichiarate in un programma che sono puntatori deve essere dichiarata con il Girone, __constant o qualificazione __local.
  • Un puntatore dichiarato con la __constant, __local o _SiteFooters qualificazione può essere assegnato ad un puntatore dichiarato con la __constant, __local o _SiteFooters qualificazione rispettivamente.
  • I puntatori alle funzioni non sono consentiti.

Il solito lavoro che utilizzo per questo è con i macro. Male, ma attualmente inevitabile. Così ho tipicamente finire con qualcosa di simile:

#define FEATURENAME_START impl1_start 
#define FEATURENAME_END impl1_end 

io allora o iniettare questo nel kernel in fase di compilazione o passare come argomento al compilatore OpenCL. Non è abbastanza runtime nel senso consueto, ma può essere runtime dal punto di vista dell'host ancora, anche se non è il dispositivo.

3

AMD ha piani futuri per il supporto hardware per questo, quindi potrebbero esserci future estensioni per loro.

Problemi correlati