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

时间:2012-02-23 22:23:11

标签: memory cuda global textures

我的内核线程以合并的方式访问线性字符数组。如果我映射 纹理的数组我没有看到任何加速。运行时间是 差不多一样。我正在研究具有计算能力2.0的Tesla C2050并阅读 全局访问被缓存的地方。真的吗?也许这就是我的原因 我没有看到运行时间的差异。

主程序中的数组是

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

我用

将它绑定到纹理texture<char> texdatabase
cudaBindTexture(NULL, texdatabase, dev_database, JOBS * FRAGMENTSIZE * sizeof(char) );

然后每个线程读取一个id为ch = tex1Dfetch(texdatabase, p + id)的字符 是threadIdx.x + blockIdx.x * blockDim.xp是偏移量。

我只绑定一次,dev_database是一个大数组。其实我发现了 如果大小太大,绑定失败。数组的大小是否有限制 绑定?非常感谢。

1 个答案:

答案 0 :(得分:3)

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

关于缓存:对于这种情况,由于您只读取字节,因此每个warp将读取32个字节,这意味着每组4个warp将映射到每个缓存行。因此,假设缓存冲突很少,您将从缓存中获得最多4倍的重用。因此,如果此内存访问是一个瓶颈,可以想象纹理缓存可能不会比通用缓存更有益。

您应首先确定您是否受带宽限制,以及此数据访问是否是罪魁祸首。完成后,然后优化内存访问。要考虑的另一个策略是每个线程每个线程访问4到16个字符(使用带字节打包/解包的char4或int4结构),而不是每个线程一个,以增加一次飞行中的内存事务数量 - 这可以帮助使全局内存总线饱和。

您可能希望观看a good presentation by Paulius Micikevicius from GTC 2010。它涵盖了分析驱动的优化和飞行中内存事务的特定概念。