This shows you the differences between two versions of the page.
asc:laboratoare:06 [2024/04/09 01:02] alexandru.bala [Executie si transfer date asincron] |
asc:laboratoare:06 [2024/04/10 12:02] (current) emil.slusanschi [Executie asincrona Host si Device] |
||
---|---|---|---|
Line 218: | Line 218: | ||
- Copiere memorie host -> device, avand < 64 KB | - Copiere memorie host -> device, avand < 64 KB | ||
- Copiere memorie host -> device, avand functii cu sufix Async | - Copiere memorie host -> device, avand functii cu sufix Async | ||
- | - Functii memorie set | + | - Functii memorie set (setare / initializare de memorie la o valoare) |
- | {{:asc:lab9:cuda_async.png?900|}} | + | Pentru a face debug unor scenarii de executie asincrona se poate dezactiva complet executia asincrona setand variabila de mediu CUDA_LAUNCH_BLOCKING la 1. Executia de kernels este sincrona cand se ruleaza cu un profiler (Nsight, Visual Profiler). |
- | Pentru a face debug unor scenarii de executie asincrona se poate dezactiva complet executia asincrona setand variabila de mediu CUDA_LAUNCH_BLOCKING la 1, care este mai ales utila in momentul in care copierea memoriei host -> device si device -> host se face pe stream-uri separate (a se vedea figura de mai jos). Executia de kernels este sincrona cand se ruleaza cu un profiler (Nsight, Visual Profiler). | + | ==== Fluxuri nonimplicite ==== |
- | + | ||
- | {{:asc:lab9:cuda_async_2.png?900|}} | + | |
- | + | ||
- | === Fluxuri nonimplicite === | + | |
Pentru a folosi cudaMemcpyAsync, este necesar lucrul cu fluxuri nonimplictie (non-default streams), care, in C/C++ pot fi declarate, create si distruse in partea de cod de pe host (CPU) in urmatorul fel: | Pentru a folosi cudaMemcpyAsync, este necesar lucrul cu fluxuri nonimplictie (non-default streams), care, in C/C++ pot fi declarate, create si distruse in partea de cod de pe host (CPU) in urmatorul fel: | ||
Line 243: | Line 239: | ||
</code> | </code> | ||
- | Pentru a emite un kernel către un flux nonimplicit, specificăm identificatorul fluxului ca al patrulea parametru de configurare a execuției. Se observă și un al treilea parametru de configurare a execuției, care este folosi pentru a aloca memorie partajată device-ului (GPU-ului), utilizându-se 0 dacă nu se dorește acest aspect. | + | Pentru a emite un kernel către un flux nonimplicit, specificăm identificatorul fluxului ca al patrulea parametru de configurare a execuției. Se observă și un al treilea parametru de configurare a execuției, care este folosit pentru a aloca memorie partajată device-ului (GPU-ului), utilizându-se 0 dacă nu se dorește acest aspect. |
<code C> | <code C> | ||
Line 255: | Line 251: | ||
==== Executie si transfer date asincron ==== | ==== Executie si transfer date asincron ==== | ||
- | Anumite device-uri pot executa un transfer asincron memorie alaturi de o executie de kernel. Acest lucru este dependent de compute capability si se poate verifica in device property asyncEngineCount. De asemenea, se pot face transferuri de memorie intra-device simultan cu executia de kernel cand atat device property concurrentKernels, cat si asyncEngineCount sunt 1. | + | Anumite device-uri pot executa un transfer asincron memorie alaturi de o executie de kernel. Acest lucru este dependent de compute capability si se poate verifica in device property asyncEngineCount. |
+ | |||
+ | {{:asc:lab9:cuda_async.png?900|}} | ||
+ | |||
+ | De asemenea, se pot face transferuri de memorie intra-device simultan cu executia de kernel cand atat device property concurrentKernels, cat si asyncEngineCount sunt 1. | ||
+ | |||
+ | {{:asc:lab9:cuda_async_2.png?900|}} | ||
===== Dynamic Paralellism ===== | ===== Dynamic Paralellism ===== |