1

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

// 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;合并?

我相信这是因为每个线程都处理连续的索引项,但我对此并不完全确定并且我不知道如何判断。

谢谢!

4

1 回答 1

2

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

编辑:很抱歉造成混乱。您一次编写“偏移”元素,我将其解释为矩阵的行。

我的意思是,在您的周期的每次迭代之后,您都会通过偏移量增加 idx。如果偏移量是计算能力为 1.x 的设备的扭曲大小的一半的倍数,或者是计算能力为 2.x 的设备的扭曲大小的倍数,那么它就会被合并,如果不是,那么你需要填充来实现它。

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

于 2011-06-22T13:40:55.043 回答