Domanda

Una cosa non ho capito e Google non mi sta aiutando, è il motivo per cui è possibile avere conflitti bancari con memoria condivisa, ma non nella memoria globale? Ci può essere conflitti bancari con i registri?

Aggiorna Wow Apprezzo molto le due risposte da Tibbit e Grizzly. Sembra che posso solo dare un segno di spunta verde per una risposta però. Sono piuttosto nuovo per impilare troppo pieno. Mi sa che devo sceglierne una risposta come il migliore. Posso fare qualcosa per dire grazie per la risposta non me ne frega un assegno verde?

È stato utile?

Soluzione

Risposta breve:. Non ci sono conflitti di banca in entrambi memoria globale o nei registri

Spiegazione:

La chiave per capire il motivo per cui è quello di cogliere la granularità delle operazioni. Un unico filo non accede alla memoria globale. accessi alla memoria globali sono "fusero". Poiché la memoria globale è soo lento, qualsiasi accesso dai fili all'interno di un blocco sono raggruppati a fare come alcune richieste alla memoria globale possibile.

memoria condivisa può accedere thread simultaneamente. Quando due thread tentano di accedere a un indirizzo all'interno della stessa banca, questo causa un conflitto banca.

Registri non può accedere da qualsiasi thread tranne quella a cui è allocato. Poiché non è possibile leggere o scrivere i miei registri, non puoi bloccare da loro accesso - di conseguenza, non ci sono conflitti bancari

.

Chi può leggere e scrittura alla memoria globale?

Only blocks. Un singolo thread può effettuare l'accesso, ma l'operazione verrà elaborato a livello di blocco (in realtà il livello di ordito / metà ordito, ma non sto provando essere complicato). Se due blocchi accedere alla stessa memoria, non credo ci vorrà più tempo e può succedere accelerata dalla cache L1 nei dispositivi più recenti -. Anche se questo non è trasparentemente evidente

Chi può leggere e scrittura alla memoria condivisa?

Any thread within a given block. Se avete solo 1 filo per ogni blocco non si può avere un conflitto banca, ma non si avrà prestazioni ragionevoli. conflitti Banca si verificano a causa di un blocco viene allocato con diversi, diciamo 512 discussioni e sono tutti in lizza per indirizzi diversi all'interno della stessa banca (non proprio lo stesso indirizzo). Ci sono alcuni eccellenti immagini di questi conflitti alla fine del CUDA C Programming Guide - Figura G2, a pagina 167 (in realtà la pagina 177 del pdf). link alla versione 3.2

Chi può leggere e scrivere ai registri?

Only the specific thread to which it is allocated. Quindi solo un thread accede in una sola volta.

Altri suggerimenti

Se o non ci possono essere conflitti bancarie su un determinato tipo di memoria è ovviamente dipendente dalla struttura della memoria e quindi del suo scopo.

memoria Allora, perché è condivisa progettato in un modo che permette di conflitti bancari?

Questo è relativamente semplice, non è facile progettare un controller di memoria in grado di gestire ingressi indipendenti sulla stessa memoria contemporaneamente (dimostrata dal fatto che la maggior parte non può). Quindi, al fine di consentire ogni thread in un halfwarp per accedere a una indirizzata individualmente parola di memoria è inclinato, con un controllore indipendente per ogni banca (almeno questo è quanto si può pensare a questo proposito, non è sicuro circa l'hardware vero e proprio). Queste banche sono intercalati a fare discussioni sequenziali di accesso sequenziale veloce di memoria. Così ognuno di queste banche in grado di gestire una sola richiesta alla volta in posizione ideale che consente per le esecuzioni simultanee di tutte le richieste nel halfwarp (ovviamente questo modello può teoricamente sostenere maggiore larghezza di banda a causa della indipendenza di queste banche, che è anche un plus).

Che dire di registri?

I registri sono progettati per essere accessibili come operandi per le istruzioni ALU, nel senso che devono essere accessibili a bassissima latenza. Pertanto ottengono più transistor / bit per rendere questo possibile. Non sono sicuro di come esattamente i registri sono accessibili a moderni processori (non il tipo di informazioni necessarie, spesso e non così facile da scoprire). Tuttavia sarebbe ovviamente molto poco pratico per organizzare i registri nelle banche (per architetture semplici in genere si vede tutti i registri appeso a un unico grande multiplexer). Quindi no, non ci saranno conflitti bancarie per i registri.

Memoria Globale

Prima di tutto memoria globale lavora su un granuality diverso di memoria quindi condivisa. La memoria è accessibile in 32, 64 o 128byte blocchi (per GT200 atleast, per Fermi è 128B sempre, ma nella cache, AMD è un po 'diverso), dove ogni volta che si desidera qualcosa da un blocco l'intero blocco si accede / trasferiti. È per questo che avete bisogno di accessi coalizzati, dal momento che se ogni filo accede alla memoria da un altro blocco è necessario trasferire tutti i blocchi.

Ma chi dice che non ci sono conflitti di banca? Io non sono del tutto sicuro di questo, perché non ho trovato tutte le fonti attuali a sostegno di questa per l'hardware NVIDIA, ma sembra logico: La memoria globale viene tipicamente distribuita su diversi chip RAM (che può essere facilmente verificato ricerca su una graphicscard). Avrebbe senso, se ciascuno di questi chip è come un banco di memoria locale, quindi si otterrebbe conflitti bancari se ci sono diverse richieste simultanee sulla stessa banca. Tuttavia gli effetti sarebbero molto meno pronunciate per una cosa (dato che la maggior parte del tempo consumato da accessi alla memoria è la latenza per ottenere i dati da A a B in ogni modo), e non sarà un effetto noticible "dentro" di un gruppo di lavoro (dal momento che solo uno esegue halfwarp alla volta e se che le questioni halfwarp più di una richiesta si dispone di un accesso alla memoria uncoalesced, quindi si sta già assumendo un colpo rendendo difficile misurare gli effetti di questo conflitto. così si ottiene solo conflitti se diversi gruppi di lavoro provare ad accedere alla stessa banca. nella tua situazione tipica per GPGPU si dispone di un grande insieme di dati che giace in memoria sequenziale quindi gli effetti non dovrebbero essere davvero noticible dato che ci sono abbastanza altri gruppi di lavoro accessinng le altre banche, allo stesso tempo, ma è dovrebbe essere possibile costruire situazioni in cui il set di dati è incentrata su pochi banche, il che renderebbe per un colpo sulla larghezza di banda (dal momento che la larghezza di banda massima sarebbe venuto da distribuire equaly accesso su tutte le banche, in modo che ogni banca avrebbe o olo hanno una frazione di tale larghezza di banda). Anche in questo caso non ho letto nulla da dimostrare questa teoria per l'hardware NVIDIA (per lo più si concentra tutto sulla coalescenza, che ovviamente è più importante in quanto rende questo un non problema per il set di dati naturali a). Tuttavia secondo l'ATI Stream calcolo guide questa è la situazione per le schede Radeon (per 5xxx: le banche sono 2kb a parte e si vuole fare in modo che si distribuiscono gli accessi (cioè da tutti worgroups simulateously attivi) equaly su tutte le banche), quindi immagino che le schede NVIDIA si comportano similmente .

Naturalmente per la maggior parte scenarious la possibilità di conflitti bancarie su memoria globale è un non problema, quindi, in pratica, si può dire:

  • Orologio per coalescenza quando si accede a memoria globale
  • Orologio di conflitti di banca quando si accede a memoria locale
  • Nessun problema con accesso ai registri

più thread accedono alla stessa banca non necessariamente c'è un conflitto banca. V'è un conflitto se le discussioni vogliono leggere allo stesso tempo da una riga diversa all'interno della stessa banca.

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