我编写了一个包含多个子程序的 CUDA 程序。当我禁用子例程 A 时,运行时间会提高 a 量。当我禁用子例程 B 时,运行时间会提高 b 量。当我禁用子例程 A 和 B 时,运行时间会提高 c > a + b。两个子程序完全相互独立。
下一部分可能是一种天真的方法来分析它,但这是我所做的:我编译了每个版本的代码并为每个二进制文件运行cuobjdump --dump-sass。结果输出是完整的二进制文件大约 1350 行,每个二进制文件大约 1100 行,其中一个子程序被禁用。如果我禁用这两个子程序,我会得到 850 行。看来我需要前三行每行 3.1 us,禁用两个子例程需要 2.4 us。
由于 A 和 B 不包含任何复杂的内容或比其他代码更密集地使用内存,我不认为这是由于注释掉所有时间密集型操作并让简单的操作保持活动状态造成的。我的猜测是,禁用 A 和 B 的程序代码仍然适合流式多处理器的指令缓存,而其他版本太大。这可能会导致全局内存访问,以便可以加载更多程序代码,而延迟会导致这种差异。不幸的是,我找不到有关指令缓存大小的任何信息。
谁能帮我解释这些结果?