Cos'è un conflitto bancario? (Esecuzione della programmazione Cuda / OpenCL)


95

Ho letto la guida alla programmazione per CUDA e OpenCL e non riesco a capire cosa sia un conflitto bancario. Si limitano a immergersi in come risolvere il problema senza approfondire l'argomento stesso. Qualcuno può aiutarmi a capirlo? Non ho preferenze se l'aiuto è nel contesto di CUDA / OpenCL o solo conflitti bancari in generale in informatica.

Risposte:


105

Per le GPU NVIDIA (e per quella materia) la memoria locale è divisa in banchi di memoria. Ogni banca può indirizzare solo un set di dati alla volta, quindi se un halfwarp cerca di caricare / memorizzare dati dalla / alla stessa banca l'accesso deve essere serializzato (questo è un conflitto di banca). Per gt200 gpu ci sono 16 banchi (32 banchi per fermi), 16 o 32 banchi per AMD gpu (57xx o superiore: 32, tutto sotto: 16)), che sono interleaved con una granuità di 32 bit (quindi i byte 0-3 sono in banco 1, 4-7 in banco 2, ..., 64-69 in banco 1 e così via). Per una migliore visualizzazione, fondamentalmente assomiglia a questo:

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 accede a valori successivi a 32 bit non ci sono conflitti di banca. Un'eccezione a questa regola (ogni thread deve accedere alla propria banca) sono le trasmissioni: se tutti i thread accedono allo stesso indirizzo, il valore viene letto una sola volta e trasmesso a tutti i thread (per GT200 devono essere tutti i thread nel halfwarp che accedono al stesso indirizzo, iirc fermi e AMD gpus possono farlo per qualsiasi numero di thread che accedono allo stesso valore).


3
Grazie dolci per l'immagine e la spiegazione. Non conoscevo le trasmissioni e questa sembra un'informazione importante :) Come dovrei verificare che i miei carichi e archivi non causino conflitti bancari nella memoria condivisa? Devo ottenere il codice assembly in qualche modo o ci sono altri modi?
contrabbandato

3
poiché il verificarsi di un conflitto bancario è qualcosa che verrà determinato in fase di esecuzione (il che significa che il compilatore non lo sa, dopo che la maggior parte degli indirizzi sono generati in fase di esecuzione), ottenere la versione compilata non sarebbe di grande aiuto. Di solito lo faccio alla vecchia maniera, dicendo che prendo carta e penna e inizio a pensare a cosa memorizza il mio codice dove. Dopotutto le regole che disciplinano il verificarsi di conflitti bancari non sono così complesse. Altrimenti puoi usare il profiler nvidia OpenCL (dovrebbe essere fornito in bundle con sdk, iirc). Penso che abbia un contatore per serializzare warp.
Grizzly

1
Grazie per aver sottolineato che warp serializza. Uno dei file di testo readme fornito con il profiler di calcolo diceva questo,
contrabbandato

1
Ack, scusa il commento sopra, per qualche motivo non posso modificarlo di nuovo. Ad ogni modo, ho trovato questo nel file readme del profiler di elaborazione, "warp_serialize: numero di warp di thread che serializzano sui conflitti di indirizzo su una memoria condivisa o costante." È fantastico poter vedere facilmente se ci sono conflitti semplicemente guardando l'output del profiler. Come fai a capire se ci sono conflitti bancari su carta e penna. Hai imparato da esempi o tutorial?
contrabbandato

1
Come ho detto la mappatura dagli indirizzi alle banche è relativamente semplice, quindi non è così difficile capire quali accessi vanno a quale banca e quindi se ci sono conflitti bancari. Il documento è solo per più modelli di accesso ai conflitti, di cui non posso farne a meno.
Grizzly

13

La memoria condivisa a cui è possibile accedere in parallelo è suddivisa in moduli (detti anche banchi). Se due posizioni di memoria (indirizzi) si verificano nello stesso banco, si verifica un conflitto di banco durante il quale l'accesso avviene in modo seriale, perdendo i vantaggi dell'accesso parallelo.


Quindi è correlato a quando un half-warp vuole immagazzinare o caricare la memoria? 16 thread cercheranno di eseguire una transazione di memoria e quindi l'accesso alla stessa banca con più di un thread causa un'elaborazione serializzata? Inoltre, come ci si assicura di non memorizzare / caricare dati nella stessa banca?
contrabbandato

10

In parole semplici, il conflitto tra banchi è un caso in cui qualsiasi modello di accesso alla memoria non riesce a distribuire l'IO tra i banchi disponibili nel sistema di memoria. I seguenti esempi elaborano il concetto: -

Supponiamo di avere un array di numeri interi 512x512 bidimensionale e il nostro sistema DRAM o di memoria ha 512 banchi in esso. Per impostazione predefinita, i dati dell'array saranno disposti in modo tale che arr [0] [0] vada al banco 0, arr [0] [1] al banco 1, arr [0] [2] al banco 2 .... arr [0] [511] va alla banca 511. Per generalizzare arr [x] [y] occupa la banca numero y. Ora un po 'di codice (come mostrato di seguito) inizia ad accedere ai dati nella colonna principale, ad es. cambiando x mantenendo costante y, il risultato finale sarà che tutti gli accessi consecutivi alla memoria raggiungeranno lo stesso banco - da qui un conflitto di banchi.

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, di solito, vengono evitati dai compilatori bufferizzando l'array o usando il numero primo di elementi nell'array.


7

(CUDA Bank Conflict) Spero che questo possa aiutare .. questa è un'ottima spiegazione ...

http://www.youtube.com/watch?v=CZgM3DEBplE


1
Nota che le risposte di solo collegamento sono scoraggiate, quindi le risposte dovrebbero essere il punto finale di una ricerca di una soluzione (rispetto a un'altra sosta di riferimenti, che tendono a diventare obsoleti nel tempo). Si prega di considerare l'aggiunta di una sinossi indipendente qui, mantenendo il collegamento come riferimento.
kleopatra

Si prega di approfondire il collegamento nel tentativo di assistere meglio il PO.
Peter Foti

1
Questo video è davvero utile! E non so perché il voto negativo! È un ottimo input! +1
Gabriel

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.