Untuk nvidia (dan amd dalam hal ini) gpus memori lokal dibagi menjadi bank memori. Setiap bank hanya dapat menangani satu dataset pada satu waktu, jadi jika halfwarp mencoba untuk memuat / menyimpan data dari / ke bank yang sama, akses harus dilakukan secara serial (ini adalah konflik bank). Untuk gt200 gpus ada 16 bank (32 bank untuk fermi), 16 atau 32 bank untuk AMD gpus (57xx atau lebih tinggi: 32, semuanya di bawah: 16)), yang disisipkan dengan granuitas 32bit (jadi byte 0-3 ada di bank 1, 4-7 di bank 2, ..., 64-69 di bank 1 dan seterusnya). Untuk visualisasi yang lebih baik, pada dasarnya terlihat seperti ini:
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 |...
...
Jadi jika setiap utas di halfwarp mengakses nilai 32bit berturut-turut, tidak ada konflik bank. Pengecualian dari aturan ini (setiap utas harus mengakses banknya sendiri) disiarkan: Jika semua utas mengakses alamat yang sama, nilainya hanya dibaca sekali dan disiarkan ke semua utas (untuk GT200 harus semua utas di halfwarp mengakses alamat yang sama, iirc fermi dan AMD gpus dapat melakukan ini untuk sejumlah utas yang mengakses nilai yang sama).
Memori bersama yang dapat diakses secara paralel dibagi menjadi beberapa modul (disebut juga bank). Jika dua lokasi memori (alamat) terjadi di bank yang sama, maka Anda mendapatkan konflik bank selama akses dilakukan secara serial, kehilangan keuntungan dari akses paralel.
sumber
Dengan kata sederhana, konflik bank adalah kasus ketika pola akses memori gagal mendistribusikan IO ke seluruh bank yang tersedia dalam sistem memori. Contoh berikut menjelaskan konsep tersebut: -
Misalkan kita memiliki array dua dimensi 512x512 bilangan bulat dan DRAM atau sistem memori kita memiliki 512 bank di dalamnya. Secara default, data array akan diatur sedemikian rupa sehingga arr [0] [0] pergi ke bank 0, arr [0] [1] pergi ke bank 1, arr [0] [2] ke bank 2 .... arr [0] [511] pergi ke bank 511. Untuk menggeneralisasi arr [x] [y] menempati nomor bank y. Sekarang beberapa kode (seperti yang ditunjukkan di bawah) mulai mengakses data di kolom mode utama yaitu. mengubah x sambil menjaga y konstan, maka hasil akhirnya adalah semua akses memori yang berurutan akan mencapai bank yang sama - maka bank konflik.
Masalah seperti itu, biasanya, dihindari oleh kompiler dengan melakukan buffering pada array atau menggunakan bilangan prima elemen dalam array.
sumber
(CUDA Bank Conflict) Saya harap ini akan membantu .. ini penjelasan yang sangat bagus ...
http://www.youtube.com/watch?v=CZgM3DEBplE
sumber
http://en.wikipedia.org/wiki/Memory_bank
dan http://mprc.pku.cn/mentors/training/ISCAreading/1989/p380-weiss/p380-weiss.pdf
Dari halaman ini, Anda dapat menemukan detail tentang bank memori. tetapi ini sedikit berbeda dari apa yang dikatakan oleh @Grizzly. di halaman ini, bank seperti ini
bank 1 2 3
alamat | 0, 3, 6 ... | | 1, 4, 7 ... | | 2, 5,8 ... |
berharap ini bisa membantu
sumber