我写了一个CUDA程序,其中包含多个子程序。当我禁用子程序A时,运行时间提高了a数量级。当我禁用子程序B时,运行时间提高了b数量级。当我禁用子程序A和B时,运行时间提高了c数量级,且c>a+b。两个子程序是完全独立的。
下面这部分可能是一种天真的分析方法,但这是我所做的:我编译了每个版本的代码,并对每个二进制文件运行了"cuobjdump --dump-sass"。完整二进制文件的输出结果约为1350行,而禁用一个子程序的二进制文件的输出结果约为1100行。如果我同时禁用两个子程序,输出结果为850行。似乎我需要3.1微秒才能处理前三个版本的每一行,而禁用两个子程序后,我只需要2.4微秒。
由于A和B不包含任何复杂的内容,也不比代码中其他部分更密集地使用内存,因此我认为这不是通过注释掉所有耗时操作并保留简单操作来实现的。我的猜测是,禁用A和B的程序代码仍适合于流多处理器的指令缓存,而其他版本过大。这可能导致全局内存访问,以便可以加载更多的程序代码,而延迟导致了这种差异。不幸的是,我找不到任何有关指令缓存大小的信息。
请问是否有人可以帮助我解释这些结果?
下面这部分可能是一种天真的分析方法,但这是我所做的:我编译了每个版本的代码,并对每个二进制文件运行了"cuobjdump --dump-sass"。完整二进制文件的输出结果约为1350行,而禁用一个子程序的二进制文件的输出结果约为1100行。如果我同时禁用两个子程序,输出结果为850行。似乎我需要3.1微秒才能处理前三个版本的每一行,而禁用两个子程序后,我只需要2.4微秒。
由于A和B不包含任何复杂的内容,也不比代码中其他部分更密集地使用内存,因此我认为这不是通过注释掉所有耗时操作并保留简单操作来实现的。我的猜测是,禁用A和B的程序代码仍适合于流多处理器的指令缓存,而其他版本过大。这可能导致全局内存访问,以便可以加载更多的程序代码,而延迟导致了这种差异。不幸的是,我找不到任何有关指令缓存大小的信息。
请问是否有人可以帮助我解释这些结果?