CUDA共享内存中的扁平与多维数组

时间:2015-07-20 01:48:32

标签: cuda

在cuda共享内存中使用扁平数组而不是多维数组是否有任何性能优势?

我知道,当涉及到主机内存空间时,扁平数组比多维数组提供了某些优势,但我不确定这是否适用于gpu共享内存中的数组。这主要是因为我见过许多在共享内存中使用多维的代码示例,例如CUDA最佳实践指南中的矩阵乘法示例。

1 个答案:

答案 0 :(得分:2)

最终将多维数组展平以映射到平坦/线性共享内存地址空间。因此,使用一个优于另一个没有性能优势。

通过在展平上使用多维共享数组,可以避免手动索引计算的负担。对于多维数组,索引计算将自动添加到窗帘后面的最终编译代码中,这使得更容易阅读源代码。

使用平面表示形式优于多维表示形式的一个优点是,您可以更轻松地推理并发现共享内存访问中的存储体冲突。考虑这个共享内存缓冲区:

__shared__ int A[ 64 ];

如果你这样访问缓冲区:

int laneID = threadIdx.x & 31;
int ret    = A[ laneID * 2 ];

与以下示例相比,区分线程之间的银行冲突可能更容易:

__shared__ int B[ 32 ][ 2 ];

您可以像这样访问它:

int laneID = threadIdx.x & 31;
int ret    = B[ laneID ][ 0 ];

请注意,上述两种情况在功能上是等效的。