假设简单的内核是这样的:加载从全局内存
__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