【发布时间】:2011-05-17 16:56:05
【问题描述】:
你好, 假设我有一个问题,每个线程计算一些东西(从常量内存中读取一些参数并使用它们进行计算)并将其存储到全局内存矩阵中。这个矩阵永远不会被读取,只是写入访问......现在是否有任何意义首先使用共享内存将所有计算值存储在其中,然后再将它们写入全局内存?我认为没有,因为对全局内存的写入完全保持不变,所以对共享内存的写入只是添加到我之前已经拥有的写入...... 谢谢!
【问题讨论】:
你好, 假设我有一个问题,每个线程计算一些东西(从常量内存中读取一些参数并使用它们进行计算)并将其存储到全局内存矩阵中。这个矩阵永远不会被读取,只是写入访问......现在是否有任何意义首先使用共享内存将所有计算值存储在其中,然后再将它们写入全局内存?我认为没有,因为对全局内存的写入完全保持不变,所以对共享内存的写入只是添加到我之前已经拥有的写入...... 谢谢!
【问题讨论】:
可能有,这取决于内核代码中的访问模式。当原始写入不会被合并时,使用共享内存缓冲区“暂存”输出可能是确保合并写入的有用方法。这对于前几代 CUDA 兼容硬件 (G80/G90) 的性能至关重要。在较新的硬件中,这种情况要弱得多。 Fermi 卡有一个非常有效的 L1 和 L2 缓存方案,它可以(在合理范围内)接近过去只有使用共享内存才能实现的方案,而无需任何额外的代码。
这个问题实际上并没有一个普遍的答案,因为它取决于任何给定代码的作用的很多细节,以及它期望在什么目标硬件上运行良好。
【讨论】: