【发布时间】:2011-10-23 00:51:45
【问题描述】:
我想知道 L2 缓存是否在多个内核调用之间被释放。例如,我有一个内核对数据进行一些预处理,而第二个内核使用它。如果数据大小小于 768 KB,是否可以实现更高的性能?我认为 NVidia 的人没有理由以其他方式实施它,但也许我错了。有人有这方面的经验吗?
【问题讨论】:
标签: caching cuda gpu gpgpu nvidia
我想知道 L2 缓存是否在多个内核调用之间被释放。例如,我有一个内核对数据进行一些预处理,而第二个内核使用它。如果数据大小小于 768 KB,是否可以实现更高的性能?我认为 NVidia 的人没有理由以其他方式实施它,但也许我错了。有人有这方面的经验吗?
【问题讨论】:
标签: caching cuda gpu gpgpu nvidia
假设您在谈论 Fermi 中的 L2 数据缓存。
我认为每次内核调用后都会刷新缓存。根据我的经验,连续两次启动同一内核并进行大量内存访问(以及#L2 缓存未命中)不会对 L1/L2 缓存统计数据产生任何实质性变化。
在您的问题中,我认为,根据数据依赖性,可以将两个阶段放入一个内核(有一些同步),以便内核的第二部分可以重用第一部分处理的数据。
这是另一个技巧:你知道 gpu 有,例如 N 个 SM,你可以使用前 N * M1 个块来执行第一部分。接下来的 N * M2 块用于第二部分。使用同步确保第一部分中的所有块同时(或几乎)完成。以我的经验,块调度顺序确实是确定性的。
希望对你有帮助。
【讨论】: