我应该在CUDA中使用音调内存用于只读2D阵列吗?

时间:2014-12-17 11:57:06

标签: memory-management cuda

我正在将一些代码从CPU移植到GPU,而在CPU端我有一个动态分配的矩阵(double **),它将被移植到GPU。但是,一旦初始化,矩阵永远不会被修改。由于我不能在GPU上使用指针指针,我应该将此矩阵表示为平面数组(double *作为matrix[i * nCols + j]访问)还是使用斜量内存?在这种情况下,使用音调记忆会导致性能提升吗?

1 个答案:

答案 0 :(得分:1)

我能想到的唯一一个例子就是如果你使用以下方式直接访问内存,那么使用内存可能会对2D数组而不是线性内存执行得更糟:

int tid = blockIdx.x * blockDim.x + threadIdx.x;
double myVal=_d_array[tid];

否则,音高至少会对齐每行的第一个条目。阅读: http://docs.nvidia.com/cuda/cuda-c-best-practices-guide/#coalesced-access-to-global-memory 绝对会帮助你理解。如果您的行很小(约16个条目),或者您使用的是2.x计算能力卡,那么当您逐行访问数据而不是线性布局时,您可以看到显着的性能提升。

对于具有2.x能力卡的逐行而没有音高的最坏情况,对于未对齐的16个双值的抓取,可能接近50%的带宽。这也可能会使你的L1缓存非常糟糕,因为它会引发额外的L1缓存行。

由于3.x中的非L1缓存,16位双打的未对齐抓取将导致32B * 5进入L2而不是32B * 4,因此性能命中可能会“很小”。

要记住的一件事是将块大小乘以32通常是一个好主意。