Che cosa è un conflitto banca? (Facendo programmazione CUDA / OpenCL)
-
27-09-2019 - |
Domanda
Ho letto la guida di programmazione per CUDA e OpenCL, e io non riesco a capire che cosa è un conflitto banca. Hanno appena sorta di tuffo nel come risolvere il problema senza elaborare sul soggetto stesso. Qualcuno può aiutarmi a capire? Non ho preferenze, se l'aiuto è nel contesto di CUDA / OpenCL o solo conflitti bancari in generale in informatica.
Soluzione
Per nvidia (e AMD per questo) GPU memoria locale è diviso in memorybanks. Ogni banca può solo indirizzo di dati alla volta, quindi se un halfwarp tenta di dati di carico / memorizzare da / per la stessa banca l'accesso deve essere serializzato (questo è un conflitto banca). Per GT200 GPU ci sono 16 banche (32banks per Fermi), 16 o 32 banche per le GPU AMD (57xx o superiore: 32, tutto di seguito: 16)), che sono intercalati un granuity di 32 bit (in modo byte 0-3 sono in banca 1, 4-7 in banca 2, ..., 64-69 in banca 1 e così via). Per una migliore visualizzazione appare sostanzialmente in questo modo:
Bank | 1 | 2 | 3 |...
Address | 0 1 2 3 | 4 5 6 7 | 8 9 10 11 |...
Address | 64 65 66 67 | 68 69 70 71 | 72 73 74 75 |...
...
Quindi, se ogni thread in un halfwarp accessi successivi 32 bit Valori non vi siano conflitti di banca. Un'eccezione a questa regola (ogni thread deve accedere alla propria banca) sono le trasmissioni: Se tutte le discussioni accedono lo stesso indirizzo, il valore viene letto una sola volta e trasmesso a tutte le discussioni (per GT200 deve essere tutte le discussioni nella halfwarp accedono lo stesso indirizzo, IIRC GPU Fermi e AMD può fare questo per qualsiasi numero di thread accesso lo stesso valore).
Altri suggerimenti
La memoria condivisa che può essere letta in parallelo è diviso in moduli (chiamati anche banche). Se due posizioni di memoria (indirizzi) si verificano nella stessa banca, quindi si ottiene un conflitto bancario , durante il quale l'accesso è fatto in serie, perdendo i vantaggi di accesso parallelo.
In parole semplici, il conflitto banca è un caso quando un modello di accesso alla memoria non riesce a distribuire IO attraverso banchi disponibili nel sistema di memoria. Gli esempi che seguono elabora il concetto: -
Supponiamo di avere due dimensioni 512x512 array di interi e la nostra DRAM o sistema di memoria dispone di 512 banche in esso. Per default i dati di matrice saranno layout in un modo che arr [0] [0] va al banco 0, arr [0] [1] va al banco 1, arr [0] [2] per banca 2 .... arr [0] [511] va alla banca 511. per generalizzare arr [x] [y] occupa numero di banco y. Ora qualche codice (come mostrato sotto) inizia l'accesso ai dati nella colonna maggiore modo cioè. cambiando x mantenendo costante y, allora il risultato finale sarà che tutti consecutivi accesso alla memoria cadrà la stessa banca -. quindi conflitto banca
int arr[512][512];
for ( j = 0; j < 512; j++ ) // outer loop
for ( i = 0; i < 512; i++ ) // inner loop
arr[i][j] = 2 * arr[i][j]; // column major processing
Tali problemi, solitamente, vengono evitati compilatori tamponando la matrice o mediante numero primo degli elementi nella matrice.
(CUDA Bank Conflict) Spero che questo aiuto sarà .. questo è molto buono spiegazione ...
http://en.wikipedia.org/wiki/Memory_bank
e
http://mprc.pku.cn/mentors /training/ISCAreading/1989/p380-weiss/p380-weiss.pdf
da questa pagina, è possibile trovare il dettaglio circa banco di memoria. ma è un po 'diverso da quello che viene detto da @Grizzly. in questa pagina, la banca è come questo
banca 1 2 3
Indirizzo | 0, 3, 6 ... | | 1, 4, 7 ... | | 2, 5,8 ... |
speriamo che questo aiuterebbe