如何确定以下内存访问是否已合并:
// Thread-ID
int idx = blockIdx.x * blockDim.x + threadIdx.x;
// Offset:
int offset = gridDim.x * blockDim.x;
while ( idx < NUMELEMENTS )
{
// Do Something
// ....
// Write to Array which contains results of calculations
results[ idx ] = df2;
// Next Element
idx += offset;
}
NUMELEMENTS
是要处理的完整数量的单个数据元素。数组results
作为指向内核函数的指针传递,并在全局内存中分配。
我的问题:行results[ idx ] = df2;
中的写访问权限是否已合并?
我相信这是因为每个线程处理连续的索引项目,但我不完全确定它&amp;我不知道怎么说。
谢谢!
答案 0 :(得分:2)
取决于矩阵线的长度是计算能力1.x的设备的经线大小的一半的倍数,还是计算能力2.x的设备的经线大小的倍数。如果不是,您可以使用填充使其完全合并。函数cudaMallocPitch可用于此目的。
编辑: 对困惑感到抱歉。你一次写'偏移'元素,我把它解释为矩阵的行。
我的意思是,在你的周期的每次迭代之后,你通过偏移增加idx。如果offset是计算能力1.x的设备的warp大小的一半的倍数,或者是计算能力2.x的设备的warp大小的倍数,那么你将它合并,如果没有,那么你需要填充来实现它。
可能它已经合并,因为你应该选择每个块的线程数,从而将blockDim作为warp大小的倍数。