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.

È stato utile?

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://www.youtube.com/watch?v=CZgM3DEBplE

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top