Para NVIDIA (e AMD), GPUS, a memória local é dividida em bancos de memória. Cada banco pode endereçar apenas um conjunto de dados por vez, portanto, se um halfwarp tentar carregar / armazenar dados de / para o mesmo banco, o acesso terá que ser serializado (este é um conflito de banco). Para gt200 gpus existem 16 bancos (32 bancos para fermi), 16 ou 32 bancos para AMD gpus (57xx ou superior: 32, tudo abaixo: 16)), que são intercalados com uma granuidade de 32 bits (portanto, o byte 0-3 está em banco 1, 4-7 no banco 2, ..., 64-69 no banco 1 e assim por diante). Para uma melhor visualização, basicamente se parece com isto:
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 |...
...
Portanto, se cada thread em um halfwarp acessa valores sucessivos de 32 bits, não há conflitos de banco. Uma exceção a esta regra (cada thread deve acessar seu próprio banco) são os broadcasts: Se todos os threads acessam o mesmo endereço, o valor é lido apenas uma vez e transmitido a todos os threads (para GT200, tem que ser todos os threads no halfwarp acessando o mesmo endereço, iirc fermi e AMD gpus podem fazer isso para qualquer número de threads acessando o mesmo valor).
A memória compartilhada que pode ser acessada em paralelo é dividida em módulos (também chamados de bancos). Se duas localizações de memória (endereços) ocorrerem no mesmo banco, você terá um conflito de banco durante o qual o acesso é feito em série, perdendo as vantagens do acesso paralelo.
fonte
Em palavras simples, o conflito de banco é um caso em que qualquer padrão de acesso à memória falha em distribuir IO entre os bancos disponíveis no sistema de memória. Os exemplos a seguir elaboram o conceito: -
Vamos supor que temos um array bidimensional de 512x512 de inteiros e nosso DRAM ou sistema de memória tem 512 bancos nele. Por padrão, os dados da matriz serão dispostos de forma que arr [0] [0] vá para o banco 0, arr [0] [1] vá para o banco 1, arr [0] [2] para o banco 2 .... arr [0] [511] vai para o banco 511. Para generalizar arr [x] [y] ocupa o banco número y. Agora, algum código (como mostrado abaixo) começa a acessar os dados na forma da coluna principal, ou seja. alterando x enquanto mantém y constante, o resultado final será que todos os acessos consecutivos à memória atingirão o mesmo banco - portanto, conflito de banco.
Esses problemas, geralmente, são evitados pelos compiladores armazenando o array em buffer ou usando um número primo de elementos no array.
fonte
(Conflito do banco CUDA) Espero que isso ajude .. esta é uma explicação muito boa ...
http://www.youtube.com/watch?v=CZgM3DEBplE
fonte
http://en.wikipedia.org/wiki/Memory_bank
e http://mprc.pku.cn/mentors/training/ISCAreading/1989/p380-weiss/p380-weiss.pdf
nesta página, você pode encontrar os detalhes sobre o banco de memória. mas é um pouco diferente do que é falado por @Grizzly. nesta página o banco é assim
banco 1 2 3
endereço | 0, 3, 6 ... | | 1, 4, 7 ... | | 2, 5,8 ... |
espero que isso ajude
fonte