2012-11-05 75 views
0

的問題是:CUDA動態共享存儲器沒有得到值

共享陣列perBlockMsg[i]保持等於0的所有值,但預計將十進制值大於0作爲d_msg[]具有的值越大。 d_msg[] ia是一個二維數組,我已將其平面化爲1D,並確保數據已成功傳遞到設備中。

__global__ void add(int *d_msg, int *d_checkSumArray) { 

    int i=threadIdx.x; 
    int j=blockIdx.x; 
    extern __shared__ int perBlockMsg[]; 

    if(d_msg[i* gridDim.x + j]<=1) 
    { 
     perBlockMsg[i]=d_msg[i* gridDim.x + j]; 
    } 

    __syncthreads(); 

    if(j==2 && i<=gridDim.x) //here i is the row number 
    { 
     d_checkSumArray[i]=perBlockMsg[i]; 
    } 
} 

內核調用瞭如下哪裏(讓說)M = 7,R = 4個,這兩個變量是動態的,以及

add<<<R,(M+R), (M+R)* sizeof(int)>>>(d_msg, d_checkSumArray); 

有人能指出問題出在哪裏可能是什麼?

+0

你可能會從這次討論一些幫助。 http://stackoverflow.com/questions/11900394/cuda-shared-memory-issue-in-outputs-depending-on-extern-declaration-and-size-of –

+0

我保持你提到的帖子的建議我的上面的代碼,但仍然不工作...這就是爲什麼我發佈它... – Shohidul

+0

不代表這行代碼意味着你只會得到1,0或負數:if(d_msg [i * gridDim.x + j] <= 1)也許這應該是一個大於或等於測試? –

回答

1

提供一個答案讓這個關閉未答覆的列表。

在代碼中的主要問題是,這個測試:

if(d_msg[i* gridDim.x + j]<=1) 

是不正確的,應該是這樣的:

if(d_msg[i* gridDim.x + j]>=1) 

捕捉「大於0的十進制值」如問題所示。

此外,共享變量的documentation中也包含後續問題。

一種方法是處理所有共享變量與一個動態分配(指針):

extern __shared__ int perBlockMsg[]; 
int *msgLength = perBlockMsg + perBlockMsgLength;