存储在纹理存储器中的常量数据:选择线性存储器还是2D / 3D阵列?

时间:2012-12-13 17:26:52

标签: cuda textures

我的不同内核将使用一些常量数据。为了优化我的代码,我正在考虑使用纹理内存而不是常量内存,因为每个线程将加载不同的数据(尽管每个块都相同)。

对于每个线程,我的数据涉及浮点( M ),浮点数的大小为3的矢量( K )或3×3矩阵浮动( J )。

我至少有两个选择:

  • 在一维数组中存储 M ,在二维数组中存储 K ,在3D数组中存储 J
  • 使用某些映射在线性内存中存储 M K J

由于线程数非常低(N = 32),哪种解决方案最好?它是等效的,还是tex1Dfetchtex2Dtex3D更快?我不需要CUDA阵列带来的功能(硬件插值等),内存限制显然不是问题。

1 个答案:

答案 0 :(得分:1)

M的访问模式完全合并,因此借助于计算能力设备的缓存层次结构的全局内存> 2.x将为该阵列提供最佳性能。

您在K和J中具有相同的访问模式,因此,访问也会合并。因此,没有理由不使用全局内存并获得最佳性能

正如你评论内存限制显然不是问题我明白数组的大小会很小,所以你会期望缓存层次结构的良好行为。

如果您想向前迈出一步,可以将K数组复制到1D纹理内存并比较两种方法的性能。