2016-03-03 77 views
0

目前正試圖用減少#3的輪廓在CUDA PDF here'官方'CUDA縮減功能無法接受某些號碼?

這裏是我的補償功能的外觀

template <typename T> 
__device__ void offsetReduction(planet<T> *bodies, T *outdata, int arrayIdent, int nbodies){ 
    extern __shared__ T sdata[]; 

    unsigned int tID = threadIdx.x; 
    unsigned int i = tID + blockIdx.x * blockDim.x; 

    if (arrayIdent == 1){ 
     if (i < nbodies){ 
      sdata[tID] = bodies[i].vx * bodies[i].mass; 
     } 

     __syncthreads(); 
    } 

    if (arrayIdent == 2){ 
     if (i < nbodies){ 
      sdata[tID] = (bodies[i].vy * bodies[i].mass); 
     } 
     __syncthreads(); 
    } 

    if (arrayIdent == 3){ 
     if (i < nbodies){ 
      sdata[tID] = (bodies[i].vz * bodies[i].mass); 
     } 
     __syncthreads(); 
    } 

    for (unsigned int stride = blockDim.x/2; stride > 0; stride >>=1) 
    { 
     if (tID < stride) 
     { 
      sdata[tID] += sdata[tID + stride]; 
     } 
     __syncthreads(); 
    } 

    if (tID == 0) 
    { 
     outdata[blockIdx.x] = sdata[0]; 
    } 

然而,它似乎並沒有被正確地工作,所以我做了一些計算。

我推出同樣數目的線程爲「INT nbodies」,在我的情況下,我選擇了5所以各5個線程的進來,並增加了一個值,SDATA []沒有問題。然而,一旦它到達了附加部分,就會出錯。

在第一次迭代線程0的訪問SDATA [3],線程1的訪問SDATA [4]和其它線程什麼也不做。在第二次迭代中,線程0訪問sdata 1,其他線程什麼也不做。然後添加完成,內核完成。但sdata [2]永遠不會被添加,所以我得到一個不正確的值存儲在sdata [0]。

我缺少的東西真的很明顯? (我一直在盯着這一段時間,所以我可能有

+1

問題尋求幫助調試「爲什麼這個代碼不工作?」)必須包含所需的行爲,特定的問題或錯誤以及在問題本身中重現問題所需的最短代碼。沒有明確問題陳述的問題對其他讀者無益。請參閱:[如何創建最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)。 – Drop

+0

如減少任何樹將只爲每塊兩個線程 – talonmies

+0

@talonmies的功率工作,我在想,但我不知道,如果我只是缺少的東西。謝謝你清理那個。 –

回答

1

這個簡化代碼,像任何其他「樹狀」減少操作一樣,要求參與共享內存減少的線程數等於2電源才能正常工作。

注意,這意味着你可以設計減少內核這將通過具有2個線程最接近較小功率進行實際減少正常運行任何多每塊2的線程你已經發布的代碼不能,然而,工作像(