假設簡單的內核是這樣的:加載從全局內存
__global__ void fg(struct s_tp tp, struct s_param p)
{
const uint bid = blockIdx.y * gridDim.x + blockIdx.x;
const uint tid = threadIdx.x;
const uint idx = bid * blockDim.x + tid;
if(idx >= p.ntp) return;
double3 r = tp.rh[idx];
double d = sqrt(r.x*r.x + r.y*r.y + r.z*r.z);
tp.d[idx] = d;
}
這是真的:
double3 r = tp.rh[idx];
數據從全局內存加載到R參數。
r存儲在寄存器中,或者在本地存儲器中存在多個變量。
r未存儲在共享內存中。
d是計算出來的,然後寫回全局內存。
寄存器比其他存儲器更快。
如果寄存器的空間已滿(一些大的內核),局部存儲器使用,並且訪問速度較慢
當我需要的雙打,是有什麼辦法可以加快步伐?例如,首先將數據加載到共享內存中,然後對其進行操作?
謝謝大家。
'double3 v'用於什麼?它被賦予一個從未使用過的值。你的表述看起來很準確由於每個線程都從'tp.rh'中讀取自己的值,讀入共享內存沒有任何好處。您可以通過在一個線程中處理多個數組元素來加快內核速度。 – 2014-11-22 09:22:20
我忘了刪除它。現在沒問題。 – Henry 2014-11-22 09:24:00