Memory CUDA:纹理内存的访问时间与合并全局内存类似吗?

Memory CUDA:纹理内存的访问时间与合并全局内存类似吗?,memory,cuda,global,textures,Memory,Cuda,Global,Textures,我的内核线程以合并方式访问线性字符数组。如果我有地图 数组到纹理我看不到任何加速。运行时间为 几乎一样。我正在开发一款具有计算能力2.0和读取功能的特斯拉C2050 缓存全局访问的地方。这是真的吗?也许这就是我的原因 我看不出跑步时间有什么不同 主程序中的数组是 char *dev_database = NULL; cudaMalloc( (void**) &dev_database, JOBS * FRAGMENTSIZE * sizeof(char) ); 我用 cudaBindT

我的内核线程以合并方式访问线性字符数组。如果我有地图 数组到纹理我看不到任何加速。运行时间为 几乎一样。我正在开发一款具有计算能力2.0和读取功能的特斯拉C2050 缓存全局访问的地方。这是真的吗?也许这就是我的原因 我看不出跑步时间有什么不同

主程序中的数组是

char *dev_database = NULL;
cudaMalloc( (void**) &dev_database, JOBS * FRAGMENTSIZE * sizeof(char) );
我用

cudaBindTexture(NULL, texdatabase, dev_database, JOBS * FRAGMENTSIZE * sizeof(char) );
然后,每个线程读取一个字符
ch=tex1Dfetch(texdatabase,p+id)
where-id 是
threadIdx.x+blockIdx.x*blockDim.x
p
是一个偏移量

我只绑定了一次,dev_数据库是一个大数组。事实上我发现了 如果大小太大,绑定将失败。数组的大小有限制吗
捆绑?非常感谢。

有几种可能性可以解释为什么您看不到性能上的任何差异,但最有可能的是,这种内存访问不是您的瓶颈。如果这不是您的瓶颈,那么加快速度对性能没有影响

关于缓存:在这种情况下,由于您只读取字节,每个扭曲将读取32个字节,这意味着每组4个扭曲将映射到每个缓存线。因此,假设缓存冲突很少,您将从缓存中获得高达4倍的重用。因此,如果这种内存访问是一个瓶颈,那么可以想象,纹理缓存可能不会比通用缓存给您带来更多好处

您应该首先确定带宽是否受限,以及此数据访问是否是罪魁祸首。一旦你做到了这一点,然后优化你的内存访问。另一个需要考虑的策略是每线程加载4到16个字符(使用一个带有字节填充/解包的CHAR4或It4结构),而不是每个线程一个以增加一次飞行中的内存事务数——这有助于饱和全局存储器总线。p>
有一个你可能想看的。它涵盖了分析驱动的优化和正在运行的内存事务的具体概念。

谢谢!你提供的链接非常有用。看起来我代码中的分支发散是瓶颈,现在我正试图删除它们。任何提示都将不胜感激:)您如何确定发散分支是您的瓶颈?顺便说一句,如果你认为答案是正确的,请接受它。我用两种方式计时程序。首先,我对所有全局内存读取进行了注释,并测量了时间。然后,我读取未注释的全局内存,注释指令,包括if-else,并测量时间。第一种方法的时间几乎与总时间相同,而后者要低得多。使用这种方法,我能够精确地找出导致分歧的if语句。只要这些更改不改变访问的数据量或通过代码的路径,这是一种不错的方法。