Banka anlaşmazlığı nedir? (Cuda / OpenCL programlama yapmak)


96

CUDA ve OpenCL için programlama kılavuzunu okuyordum ve banka anlaşmazlığının ne olduğunu anlayamıyorum. Sadece konunun ayrıntılarına girmeden sorunun nasıl çözüleceğine dalarlar. Biri anlamama yardım edebilir mi? Yardımın CUDA / OpenCL bağlamında mı yoksa bilgisayar biliminde genel olarak banka çatışmaları mı olduğu konusunda bir tercihim yok.

Yanıtlar:


106

Nvidia (ve bu konuda amd) gpus için yerel bellek bellek bankalarına bölünmüştür. Her banka bir seferde yalnızca bir veri kümesine hitap edebilir, bu nedenle bir halfwarp aynı bankadan veri yüklemeye / depolamaya çalışırsa, erişimin serileştirilmesi gerekir (bu bir banka çakışmasıdır). Gt200 gpus için 16 banka (fermi için 32 banka), AMD gpus için 16 veya 32 banka (57xx veya üstü: 32, aşağıdaki her şey: 16)) vardır ve bunlar 32 bitlik bir granuite (dolayısıyla 0-3 baytı içerdedir) banka 1, banka 2'de 4-7, ..., banka 1'de 64-69 vb.). Daha iyi bir görselleştirme için temelde şuna benzer:

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 |...
...

Bu nedenle, bir halfwarp'taki her bir iş parçacığı ardışık 32 bit değerlere erişirse, banka çakışması olmaz. Bu kuralın bir istisnası (her iş parçacığının kendi bankasına erişmesi gerekir) yayınlardır: Tüm iş parçacıkları aynı adrese erişirse, değer yalnızca bir kez okunur ve tüm iş parçacıklarına yayınlanır (GT200 için, yarım genişlikte tüm iş parçacıklarının aynı adres, iirc fermi ve AMD gpus, aynı değere erişen herhangi bir sayıda iş parçacığı için bunu yapabilir).


3
Görsel ve açıklama için çok teşekkürler. Yayınları bilmiyordum ve bu önemli bir bilgi parçası gibi görünüyor :) Yüklerimin ve depolarımın paylaşılan bellekte banka çakışmalarına neden olmadığını nasıl doğrulayabilirim? Bir şekilde montaj koduna girmem gerekiyor mu yoksa başka yollar var mı?
kaçak Pancakes

3
Banka çatışmasının ortaya çıkması, çalışma zamanında belirlenecek bir düşünce olduğundan (derleyici, çoğu adres çalışma zamanında üretildikten sonra, derleyicinin bunu bilmediği anlamına gelir), derlenmiş sürümü almak pek yardımcı olmaz. Bunu genellikle eski yöntemlerle yapıyorum, bir kalem kağıt alıp kodumun nerede sakladığını düşünmeye başlıyorum. Sonuçta, banka anlaşmazlıklarının oluşumunu yöneten kurallar o kadar da karmaşık değil. Aksi takdirde, nvidia OpenCL profil oluşturucusunu kullanabilirsiniz (sdk, iirc ile birlikte verilmelidir). Sanırım warp serileştirmeleri için bir sayacı var.
Grizzly

1
Warp serileştirmelerini gösterdiğin için teşekkürler. Hesaplama profiliyle birlikte gelen benioku metin dosyalarından biri şunu söyledi:
kaçak

1
Ack, yukarıdaki yorumu affedin, bazı nedenlerden dolayı yeniden düzenleyemiyorum. Her neyse, bunu hesaplama profilleyicisinin benioku dosyasında buldum, "warp_serialize: Adres çakışmalarını paylaşılan veya sabit belleğe serileştiren iş parçacığı çarpıtma sayısı." Bu, sadece profil oluşturucu çıktısına bakarak çakışma olup olmadığını kolayca görebilmem harika. Kağıt kalem üzerinde banka anlaşmazlığı olup olmadığını nasıl anlarsınız? Herhangi bir örnek veya öğreticiden öğrendiniz mi?
kaçak Pancakes

1
Dediğim gibi, adreslerden bankalara eşleme nispeten basittir, bu nedenle hangi erişimlerin hangi bankaya gittiğini ve dolayısıyla banka anlaşmazlıkları olup olmadığını anlamak o kadar da zor değil. Kağıt yalnızca, onsuz yapamayacağım daha fazla çakışan erişim modeli içindir.
Grizzly

13

Paralel olarak erişilebilen paylaşımlı bellek modüllere (bankalar da denir) bölünmüştür. Aynı bankada iki bellek konumu (adres) meydana gelirse , paralel erişimin avantajlarını kaybederek erişimin seri olarak yapıldığı bir banka çakışması yaşarsınız.


Öyleyse bu, yarım çarpıklığın bellek depolamak veya yüklemek istemesiyle ilgili mi? 16 iş parçacığı bir bellek işlemi yapmaya çalışıyor olacak ve bu nedenle aynı bankaya birden fazla iş parçacığı ile erişmek serileştirilmiş işleme neden oluyor mu? Ayrıca, verileri aynı bankada saklamadığınızdan / yüklemediğinizden nasıl emin olabilirsiniz?
smuggledPancakes

10

Basit bir deyişle, banka çakışması, herhangi bir bellek erişim modelinin IO'yu bellek sisteminde bulunan bankalar arasında dağıtamadığı bir durumdur. Aşağıdaki örnekler kavramı detaylandırmaktadır: -

Diyelim ki iki boyutlu 512x512 tamsayı dizisi var ve DRAM veya bellek sistemimizde 512 banka var. Varsayılan olarak dizi verisi, arr [0] [0] bank 0'a, arr [0] [1] bank 1'e, arr [0] [2] bank 2'ye ... arr [0] [511], bank 511'e gider. arr [x] [y], banka numarası y'yi kullanır. Şimdi bazı kodlar (aşağıda gösterildiği gibi) verilere ana sütun tarzında erişmeye başlar. y'yi sabit tutarken x'i değiştirirseniz, sonuç, tüm ardışık bellek erişiminin aynı kümeye çarpmasıdır - dolayısıyla banka çakışması.

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

Bu tür problemler, genellikle, diziyi arabelleğe alarak veya dizideki elemanların asal sayısını kullanarak derleyiciler tarafından önlenir.


8

(CUDA Bank Conflict) Umarım bu yardımcı olur .. bu çok güzel bir açıklama ...

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


1
Not o bağlantı sadece cevaplar tavsiye edilmez, SO cevaplar çözüm (vs. henüz zamanla bayat almak eğilimindedir referanslar, başka mola) için bir aramanın son nokta olmalıdır. Lütfen bağlantıyı referans olarak koruyarak buraya bağımsız bir özet eklemeyi düşünün.
kleopatra

Lütfen OP'ye daha iyi yardımcı olmak için bağlantıyı detaylandırın.
Peter Foti

1
Bu video gerçekten yardımcı oluyor! Ve neden olumsuz oy verdiğini bilmiyorum! Bu çok iyi bir girdi! +1
Gabriel

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.