我有一个应用程序,我需要将全局内存中的单个(非常量,只是普通的旧数据)值广播到所有线程。线程只需要读取该值,而不是写入它。我无法明确告诉应用程序使用常量缓存(例如 cudaMemcpyToSymbol),因为我使用的内存包装库没有给我显式的低级控制。
我想知道这个广播是如何在幕后发生的,以及它与每个线程访问唯一全局内存位置的通常访问模式有何不同(为简单起见,假设这种“通常”访问模式是合并的)。我对广播案例中可能发生的任何隐式序列化以及不同架构如何影响它特别感兴趣。
例如,对于 Fermi,大概第一个访问该值的线程会将其拉到 L2 缓存,然后拉到其 SM 的 L1 缓存,此时驻留在 SM 上的每个线程都会尝试从 L1 缓存中获取它。当所有线程都尝试访问相同的 L1 缓存值时,是否有任何序列化惩罚?
对于 Kepler,大概第一个访问该值的线程会将其拉入 L2 缓存(然后可能会或可能不会将其拉入 L1 缓存,具体取决于是否启用了 L1 缓存)。当所有线程都尝试访问 L2 中的相同值时,是否有任何序列化惩罚?
另外,分区露营是否值得关注?
我发现了另外几个问题,它们解决了类似的主题,但细节程度不足以满足我的好奇心。
提前致谢!