如何确定此写访问权是否已合并?

时间:2011-06-22 12:46:40

标签: coalesce cuda

如何确定以下内存访问是否已合并:

// 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;我不知道怎么说。

谢谢!

1 个答案:

答案 0 :(得分:2)

取决于矩阵线的长度是计算能力1.x的设备的经线大小的一半的倍数,还是计算能力2.x的设备的经线大小的倍数。如果不是,您可以使用填充使其完全合并。函数cudaMallocPitch可用于此目的。

编辑: 对困惑感到抱歉。你一次写'偏移'元素,我把它解释为矩阵的行。

我的意思是,在你的周期的每次迭代之后,你通过偏移增加idx。如果offset是计算能力1.x的设备的warp大小的一半的倍数,或者是计算能力2.x的设备的warp大小的倍数,那么你将它合并,如果没有,那么你需要填充来实现它。

可能它已经合并,因为你应该选择每个块的线程数,从而将blockDim作为warp大小的倍数。