2011-12-09 55 views
0

二維數組我是新來的CUDA,我想實現乘法加法,這個等式總和乘法在CUDA

enter image description here

enter image description here

我寫了這個代碼在CUDA,但它並沒有給出正確的答案

mulFV1[idx] = f[idx][idy]*compV2[idy]; 
mulFV2[idy] = f[idx][idy]*compV1[idx]; 

,然後,我送陣列mulFV1和mulFV2減少設備功能..

問題是我該如何調試它?

注:要在畫面mulFV1是行的關注和關心mulFV2在列

+0

結果被放置在一個變量R [I]?如:R [I] = f [K] [I] * V1 [K]? – Tudor

+0

你解決了那個問題?什麼類型的f?你想獲得兩個數組作爲輸出嗎? – Yappie

+0

@Tudor我希望輸出是一個變量,但因爲我使用CUDA,我必須將每個線程的結果放在一個數組中,並將它們添加到另一個函數中。 – asma

回答

1

我想,你的內核可能是這個樣子以下

__global__ void kernel_code(const int* f,const int* v1,const int* v2, int* outv1, int* outv2) 
{ 
    int idx = blockIdx.x * blockDim.x + threadIdx.x; 
    int idy = blockIdx.y * blockDim.y + threadIdx.y; 
    if (idx<MAX_X && idy <MAX_Y) 
    { 
     if(idx==0) 
     { 
      outv2[idy]=0; 
     } 
     if(idy==0) 
     { 
      outv1[idx]=0; 
     } 
     __syncthreads(); 

     atomicAdd(&(outv1[idx]),f[idy*MAX_Y+ idx]*v2[idy]); 
     atomicAdd(&(outv2[idy]),f[idy*MAX_Y+idx]*v1[idx]); 
    } 
} 
+0

親愛的Yappie,你能告訴我關於if語句(if(idx == 0)和if(idy == 0)..什麼? – asma

+0

謝謝Yappie,veeeery很多,它工作正常,我真的很高興你...... – asma

+0

這個聲明被使用,因爲只有一個線程必須提供初始化初始化。對於所有第16個線程,'outv1'只會被初始化爲'idx == 0', 'idy'是一樣的。 – Yappie

0

你的變量名錶示,第一行是使用矢量v1乘法,第二個具有v2。但是,你正在交叉。也許你想有

mulFV1[idx] = f[idx][idy]*compV1[idy]; 
mulFV2[idy] = f[idx][idy]*compV2[idx]; 

與索引1和2交換?

+0

如果你在我的問題中檢查數學方程,你會知道第一個eq。關注行,所以我不會改變。對於第二個eq。關於列,所以我不改變.. – asma