2016-03-28 18 views
-3

9 ve 10 no'lu satırları alamıyorum; kullanılan ve Col + (m*TILE_WIDTH + ty)*Width formülüyle hesaplanan endeks.__shared__ aşağıdaki kodda çalışıyor?

Birisi bu kodu anlamada bana yardımcı olabilir, yani __shared__?

__global__ void MatrixMulKernel(float* Md, float* Nd, float* Pd, int Width) 
{ 
__shared__float Mds[TILE_WIDTH][TILE_WIDTH]; 
__shared__float Nds[TILE_WIDTH][TILE_WIDTH]; 
3. int bx = blockIdx.x; int by = blockIdx.y; 
4. int tx = threadIdx.x; int ty = threadIdx.y; 
// Identify the row and column of the Pd element to work on 
5. int Row = by * TILE_WIDTH + ty; 
6. int Col = bx * TILE_WIDTH + tx; 
7. float Pvalue = 0; ; 
// Loop over the Md and Nd tiles required to compute the Pd element 
8. for (int m = 0; m < Width/TILE_WIDTH; ++m) { 
// Coolaborative loading of Md and Nd tiles into shared memory 
9.Mds[ty][tx] = Md[Row*Width + (m*TILE_WIDTH + tx)]; 
10.Nds[ty][tx] = Nd[Col + (m*TILE_WIDTH + ty)*Width]; 
11.__syncthreads(); 
11. for (int k = 0; k < TILE_WIDTH; ++k) 
12.Pvalue += Mds[ty][k] * Nds[k][tx]; 
13. Synchthreads(); 
    } 
    Pd[Row*Width+Col] = Pvalue; 
    } 

cevap

2

__shared__ bellek ekran kartında hızlı bir (fakat küçük) çip üzerinde bir kaynaktır.

Çarpılacak matrisler, genel bellekte başlar (Md ve Nd). Çizgiler 10 ve 11:

Mds[ty][tx] = Md[Row*Width + (m*TILE_WIDTH + tx)]; // line 10 
Nds[ty][tx] = Nd[Col + (m*TILE_WIDTH + ty)*Width]; // line 11 

paylaşılan hafıza kopyası (Mds veya Nds) içine matrisin "döşeme" (kare alt bölüm) (ya Md veya Nd) çarpılmalıdır her yük. Tek bir kod satırının tümüyle "kiremit" yüklemesinin nedeni, threadblock'un tüm iş parçacıklarının bir kod satırını yürütmesidir. Sonuç olarak, bir veri bloğu boyutu "yığın" veya "kiremit", genelden paylaşılan belleğe taşınır.

Paylaşılan bellekte olduğunda, gerçek çarpma 14 satırında yapılır. 14 satırı, genel bellek yerine paylaşılan belleğin dışında çalışıyor olduğundan ve blokta bitişik parçacıklar arasında veri yeniden kullanıldığı için, toplam çarpma işlem daha hızlı çalışır, çünkü paylaşılan belleğe global bellekten daha hızlı erişilebilir.

Benzer bir kod ve açıklama in the programming guide verilir.

+0

Cevabınız için teşekkürler efendim ama efendim, 1D indeksleme satır ve cols ile bu formül çerçeveleme hile anlamada bana yardımcı eğer daha yararlı olacaktır. 2B mutlak endeksinden 1D indeksi için formülü çerçevelemek benim için biraz zor. –

+1

2B indekslerinden 1D indeksi oluşturmak için, 2D indekslerinin satır indeksini aldık, veri setinin genişliği ile çarpın ve kolon indeksini ekleyin. '1Dindex = (2Drow) * (width) + (2Dcolumn)' 'Mds' durumunda, seçilen satır sadece' Satır'dır. 'Nds' durumunda, seçilen satır' (m * TILE_WIDTH + ty) 'tarafından verilir, çünkü daha büyük matris içindeki belirli döşeme için ofset ayarlanır. –

İlgili konular