This shows you the differences between two versions of the page.
asc:laboratoare:06 [2025/04/09 07:38] alexandru.bala [Fluxuri nonimplicite] |
asc:laboratoare:06 [2025/04/09 09:11] (current) alexandru.bala [Fluxuri nonimplicite] |
||
---|---|---|---|
Line 212: | Line 212: | ||
==== Executie asincrona Host si Device ==== | ==== Executie asincrona Host si Device ==== | ||
- | Folosind apeluri asincrone, operatiile de executie catre device sunt puse in coada avand controlul intors catre host instant. Astfel unitatea host poate continua executia fara sa fie blocata in asteptarea executiei. | + | Folosind apeluri asincrone, operatiile de executie catre device sunt puse in coada avand controlul intors catre host instant. Astfel unitatea host poate continua executia fara sa fie blocata in asteptarea altor task-uri. |
Urmatoarele operatii sunt asincrone relativ la host: | Urmatoarele operatii sunt asincrone relativ la host: | ||
- Lansari de kernel | - Lansari de kernel | ||
- | - Copieri in cadrul spatiului de memorie a unui device | + | - Copieri in cadrul spatiului de memorie al unui device |
- 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 | ||
Line 224: | Line 224: | ||
==== Fluxuri nonimplicite ==== | ==== 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 nonimplicite (non-default streams), care, in C/C++ pot fi declarate, create si distruse in partea de cod de pe host (CPU) in urmatorul fel: |
<code C> | <code C> | ||
Line 237: | Line 237: | ||
<code C> | <code C> | ||
- | result = cudaMemcpyAsync(d_a, a, N, cudaMemcpyHostToDevice, stream1); | + | // num_bytes = N * sizeof (type_a); |
+ | result = cudaMemcpyAsync(d_a, a, num_bytes, cudaMemcpyHostToDevice, stream1); | ||
</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 folosit 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ă (shared memory) device-ului (GPU-ului), utilizându-se 0 dacă nu se dorește acest aspect. |
<code C> | <code C> |