在全局内存中访问2D数组时,使用纹理缓存有许多好处,例如过滤,而不必关心内存访问模式。 CUDA编程指南只命名了一个缺点:
但是,在同一个内核调用中,纹理缓存与全局内存写入不保持一致,因此任何纹理提取到通过同一内核调用中的全局写入写入的地址都会返回未定义的数据
如果我不需要,因为我从不写入我读取的内存,使用纹理缓存(或Image2D,因为我在OpenCL中工作)时是否有任何缺点/陷阱/问题简单的全球记忆?在任何情况下我都会使用纹理缓存失去性能吗?
答案 0 :(得分:8)
纹理可以比“裸”全局内存访问更快,速度更快或更慢。使用纹理预测性能没有一般的经验法则,因为加速(或缺乏加速)是由代码中的数据使用模式和正在使用的纹理硬件决定的。
在最坏的情况下,缓存命中率非常低,使用纹理比正常内存访问慢。每个线程必须首先具有高速缓存未命中,然后触发全局内存提取。产生的总延迟将高于直接从内存中读取。我几乎总是写两个版本的任何严格的代码我正在开发纹理可能有用(一个有一个没有),然后对它们进行基准测试。通常可以开发启发式算法以根据输入选择要使用的版本。 CUBLAS广泛使用这一策略。