====== Profiling des transferts de données en mémoire ======
Bande passante : quantité de données transférées par unité de temps.
Manque : Actual data throughput vs. effective bandwidth
===== Types de transferts de données =====
Entre RAM et GPU, interne au GPU (shared, globale, locale) et entre GPU et externe (GPU Directe).
Théorique : avec largeur du bus mémoire et fréquence du bus. Accessible via
cudaGetDeviceProperties()
(propriétés
memoryClockRate
et
memoryBusWidth
).
2.0 * memoryClockRate * (memoryBusWidth / 8) * 1.e-6
en GB/s (Go/s). Facteur 2.0 = double data rate par clock.
Influence de nombre de kernels, taille blocs et tableau, code de correction des erreurs, coallescence des données.
===== Comment mesurer la bande passante =====
Avec données de taille connu, mesure du temps total de transfert. Formule (Go/s) (R_B et W_B en octets par kernel) :
{{ :450-1_bande_passante_reelle.png |}}
Formule de calcul de la bande passante
Mesurer débit théorique et effectif et ratio.
===== Trouver le bottleneck mémoire =====
Création de 3 kernels : normal, math et mémoire. Si mémoire proche de 100% et supér.3.ieur à math, alors limitation à cause de la bande passante.
===== Vérifier les accès aux DRAM Banks =====
Coalescence des données, chargement par bloc.