In C++ AMP, le funzioni del kernel o lambdas sono contrassegnate con restrizioni (amp), che impone severe restrizioni sul sottoinsieme consentito di C++ (listed here). CUDA consente più libertà sul sottoinsieme di C o C++ nelle funzioni del kernel?La restrizione (amp) è più restrittiva del codice del kernel CUDA?
risposta
A partire da Visual Studio 11 e CUDA 4.1, le funzioni restrict(amp)
sono più restrittive delle analoghe funzioni di CUDA. Il più notevolmente, AMP è più restrittivo su come i puntatori possono essere usati. Questa è una conseguenza naturale del substrato computazionale DirectX11 di AMP, che non consente l'uso di puntatori nel codice HLSL (shader grafico). Per contrasto, l'IR di livello inferiore di CUDA è PTX, che è più generico di HLSL.
Ecco una linea di confronto riga:
| VS 11 AMP restrict(amp) functions | CUDA 4.1 sm_2x __device__ functions |
|------------------------------------------------------------------------------|
|* can only call functions that have |* can only call functions that have |
| the restrict(amp) clause | the __device__ decoration |
|* The function must be inlinable |* need not be inlined |
|* The function can declare only |* Class types are allowed |
| POD variables | |
|* Lambda functions cannot |* Lambdas are not supported, but |
| capture by reference and | user functors can hold pointers |
| cannot capture pointers | |
|* References and single-indirection |* References and multiple-indirection |
| pointers are supported only as | pointers are supported |
| local variables and function | |
|* No recursion |* Recursion OK |
|* No volatile variables |* Volatile variables OK |
|* No virtual functions |* Virtual functions OK |
|* No pointers to functions |* Pointers to functions OK |
|* No pointers to member functions |* Pointers to member functions OK |
|* No pointers in structures |* Pointers in structures OK |
|* No pointers to pointers |* Pointers to pointers OK |
|* No goto statements |* goto statements OK |
|* No labeled statements |* Labeled statements OK |
|* No try, catch, or throw statements |* No try, catch, or throw statements |
|* No global variables |* Global __device__ variables OK |
|* Static variables through tile_static |* Static variables through __shared__ |
|* No dynamic_cast |* No dynamic_cast |
|* No typeid operator |* No typeid operator |
|* No asm declarations |* asm declarations (inline PTX) OK |
|* No varargs |* No varargs |
Si può leggere di più su restrizioni l' restrict(amp)
here. È possibile leggere il supporto C++ nelle funzioni CUDA __device__
nell'appendice D dello CUDA C Programming Guide.
IIRC c'è una discussione qui su funzionalità che C++ AMP avrebbe potuto abilitare ma non ha fatto, a volte basate su scelte esplicite per incoraggiare buone pratiche nel calcolo parallelo: http://channel9.msdn.com/Shows/Going+Deep/C- AMP-The-sviluppo-team-tecnico-Tavola rotonda –
- 1. all'interno del kernel cuda
- 2. Esecuzione concomitante del kernel CUDA con più kernel per flusso
- 3. Tracciamento dell'uso del registro del kernel Cuda
- 4. Riduzione del numero di registri utilizzati nel kernel CUDA
- 5. Parametri ai kernel CUDA
- 6. Analisi dell'accesso alla memoria coalescenza del mio kernel CUDA
- 7. Confusione su CUDA/openCL e C++ AMP
- 8. versione del driver CUDA è insufficiente per la versione CUDA runtime
- 9. Problemi lanciare i kernel CUDA dal codice di inizializzazione statica
- 10. Ottimizzazione del codice del kernel in opencl per una GPU
- 11. Come eseguire il debug nel codice del kernel CUDA utilizzando Visual Studio 2008?
- 12. Copertura del codice kernel Linux - GCOV
- 13. Esecuzione simultanea del kernel GPU da più processi
- 14. Codice sorgente del kernel Android 4.0?
- 15. PyOpenCL indicizzazione di array 3D all'interno del codice del kernel
- 16. Comando non crittografato per il kernel CUDA
- 17. Timing di diverse sezioni nel kernel CUDA
- 18. Restrizione del numero di core utilizzati
- 19. CUDA kernel piccolo 2d convoluzione - come farlo
- 20. Perché la restrizione del tipo non è parte della firma del metodo?
- 21. Come velocizzare la compilazione del kernel Linux?
- 22. Capire questo kernel CUDA lancia i parametri
- 23. Qual è lo stato stack del kernel del processo Linux durante la creazione del processo?
- 24. Invio di array 2D a Cuda Kernel
- 25. Come si profila e si ottimizzano i kernel CUDA?
- 26. lista del kernel Linux.h
- 27. quella che è la "corrente" in linux sorgenti del kernel
- 28. Come aggiungere la funzione fasync al codice del modulo del kernel?
- 29. Come aggiungere la funzione di polling al codice del modulo del kernel?
- 30. Macro del compilatore CUDA (nvcc)
Può essere correlato alla seguente domanda. http://stackoverflow.com/questions/4899425/what-are-the-real-c-language-constructs-supported-by-cuda-device-code –
Buona domanda, anche se temo che non sia realmente comparabile (forse migrate a programmers.SE?): nvcc non supporta ancora il C++ 11, quindi quando parliamo di lambda voi ovviamente non andate molto lontano! D'altra parte, AMP ha restrizioni completamente diverse, a partire dal fatto che è Microsoft; che (o, forse più correttamente, l'attuale mancanza di un'implementazione non DirectX) lo rende completamente inutilizzabile per molti, ad es. applicazioni scientifiche. Ma suppongo tu intenda solo restrizioni _lingue? – leftaroundabout
@leftaroundabout: Sì, sto solo parlando delle restrizioni _lingua e sto bene con C++ 03. Ho menzionato lambda solo perché è il meccanismo prescritto per l'avvio del codice del kernel con C++ AMP. – Eugene