CUDA 编程指南指出
“带宽是影响性能的最重要的门控因素之一。几乎所有对代码的更改都应该在它们如何影响带宽的背景下进行。”
它继续计算每秒数百 GB 的理论带宽。我不知道为什么一个可以读取/写入全局内存的字节数反映了内核的优化程度。
如果我有一个内核,它对存储在共享内存和/或寄存器中的数据进行密集计算,在开始时只有一次读取并在结束时从全局内存中写入,那么有效带宽肯定会很小,而内核本身可能非常有效。
有人可以在这种情况下进一步解释带宽吗?
谢谢
CUDA 编程指南指出
“带宽是影响性能的最重要的门控因素之一。几乎所有对代码的更改都应该在它们如何影响带宽的背景下进行。”
它继续计算每秒数百 GB 的理论带宽。我不知道为什么一个可以读取/写入全局内存的字节数反映了内核的优化程度。
如果我有一个内核,它对存储在共享内存和/或寄存器中的数据进行密集计算,在开始时只有一次读取并在结束时从全局内存中写入,那么有效带宽肯定会很小,而内核本身可能非常有效。
有人可以在这种情况下进一步解释带宽吗?
谢谢
大多数非平凡的计算内核,在 CPU 和 GPU 领域,内存受限。GPU 具有非常高的计算强度和吞吐量,但对主存储器的访问非常慢并且具有高延迟,每次读取/存储几百个周期,而对于许多算术运算则需要四个周期。
听起来您的内核受计算限制,所以您的运气。但是,您仍然需要注意共享内存库冲突,这可能会意外地序列化部分代码。
通常,内核相当小且简单,并且对大量数据执行相同的操作。您可能会按顺序调用一堆内核来执行一些更复杂的操作(将其视为处理管道)。显然,您的管道的吞吐量将取决于您的内核的效率以及您是否受到内存带宽的任何限制。