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

Cuda 存储在纹理内存中的常量数据:选择线性内存还是2D/3D阵列?,cuda,textures,Cuda,Textures,我的不同内核将使用一些常量数据。为了优化我的代码,我考虑使用纹理内存而不是常量内存,因为每个线程将加载不同的数据块(尽管每个块都相同) 对于每个线程,我的数据涉及一个浮点(M),一个大小为3的浮点向量(K),或者一个3乘3的浮点矩阵(J) 我至少有两个选择: 在一维数组中存储M,在二维数组中存储K,在三维数组中存储J 通过一些映射将M、K和J存储在线性内存中 由于线程数非常少(N=32),哪种解决方案最好?它是等效的还是tex1Dfetch比tex2D和tex3D快?我不需要CUDA阵列带来

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

对于每个线程,我的数据涉及一个浮点(M),一个大小为3的浮点向量(K),或者一个3乘3的浮点矩阵(J

我至少有两个选择:

  • 在一维数组中存储M,在二维数组中存储K,在三维数组中存储J
  • 通过一些映射将MKJ存储在线性内存中

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

您对
M
的访问模式完美结合,因此借助compute capability devices>2.x的缓存层次结构,全局内存将为该阵列提供最佳性能

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

正如您所评论的,内存限制显然不是一个问题,我理解阵列的大小将很小,因此您希望缓存层次结构表现良好


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

您对
M
的访问模式是完美结合的,因此借助compute capability devices>2.x的缓存层次结构,全局内存将为该阵列提供最佳性能

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

正如您所评论的,内存限制显然不是一个问题,我理解阵列的大小将很小,因此您希望缓存层次结构表现良好


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

你的访问模式是随机的吗?您将使用哪种计算功能?不,基本上线程
i
将访问
M[i]
K[0..2][i]
等。我使用的是CC 3.0。您的访问模式是随机的吗?您将使用哪种计算功能?不,基本上线程
i
将访问
M[i]
K[0..2][i]
等。我使用的是CC 3.0。难道
K[i][0..2]
不是AoS吗?内存看起来是这样的:
K0x K0y K0z | K1x K1y K1z | K2x…
,因此当加载向量的
x
坐标时,内存访问将是不平衡的。另一种方法是:如果我使用
tex1Dfetch
来获取id为
tid
(带有
K[0..2][tid]的线程的
x
-K坐标
),它看起来像
tex1Dfetch(TEXTURE\u REF\u K,tid+x*NTHREADS)
。你的方法应该是
tex1Dfetch(TEXTURE\u REF\u K,tid*3+x)
,不是吗?Ups,你说得对。我错了。这个问题我应该读两遍以上。
K[I][0..2]
不是AoS吗?内存看起来是这样的:
K0x K0y K0z | K1x K1y K1z | K2x…
,因此当加载向量的
x
坐标时,内存访问将是不平衡的。另一种方法是:如果我使用
tex1Dfetch
来获取id为
tid
(带有
K[0..2][tid]的线程的
x
-K坐标
),它看起来像
tex1Dfetch(TEXTURE\u REF\u K,tid+x*NTHREADS)
。你的方法应该是
tex1Dfetch(TEXTURE\u REF\u K,tid*3+x)
,不是吗?Ups,你说得对。我错了。这个问题我应该读两遍以上。