【问题标题】:CUDA: are access times for texture memory similar to coalesced global memory?CUDA:纹理内存的访问时间是否类似于合并的全局内存?
【发布时间】:2012-03-14 09:45:16
【问题描述】:

我的内核线程以合并的方式访问线性字符数组。如果我映射 数组到纹理我没有看到任何加速。运行时间是 差不多一样。我正在研究具有计算能力 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) );

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

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

【问题讨论】:

    标签: memory cuda global textures


    【解决方案1】:

    您没有看到任何性能差异的原因有多种可能性,但最有可能的是这种内存访问不是您的瓶颈。如果它不是您的瓶颈,那么加快它对性能没有影响。

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

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

    您可能想观看a good presentation by Paulius Micikevicius from GTC 2010。它涵盖了分析驱动的优化和动态内存事务的具体概念。

    【讨论】:

    • 谢谢!您提供的链接非常有帮助。看起来我的代码中的不同分支是瓶颈,现在我正在尝试删除它们。任何提示将不胜感激:)
    • 您如何确定分歧分支是您的瓶颈?顺便说一句,如果您认为答案是正确的,请接受它。
    • 我以两种方式为程序计时。首先,我评论了所有全局内存读取和测量时间。然后我取消了全局内存读取的注释,注释了包括 if-else 在内的指令,并测量了时间。第一种方法的时间与总时间几乎相同,而后者要低得多。使用这种方法,我能够查明导致分歧的确切 if 语句。
    • 不错的方法,只要更改不会更改访问的数据量或通过代码采用的路径。
    猜你喜欢
    • 2012-05-06
    • 1970-01-01
    • 2012-01-08
    • 2013-02-14
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    相关资源
    最近更新 更多