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]。
我缺少的東西真的很明顯? (我一直在盯着這一段時間,所以我可能有
問題尋求幫助調試「爲什麼這個代碼不工作?」)必須包含所需的行爲,特定的問題或錯誤以及在問題本身中重現問題所需的最短代碼。沒有明確問題陳述的問題對其他讀者無益。請參閱:[如何創建最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)。 – Drop
如減少任何樹將只爲每塊兩個線程 – talonmies
@talonmies的功率工作,我在想,但我不知道,如果我只是缺少的東西。謝謝你清理那個。 –