3

运行我的应用程序时,第一个 cuda_malloc 需要 40 秒,这是由于 GPU 的初始化。当我在调试模式下构建时,这减少到 5 秒,而当我在 Fermi 设备上运行相同的代码时,它需要的时间远远少于一秒(在我的情况下甚至不值得测量)。

现在有趣的是,如果我为这个特定的架构进行编译,使用标志 sm35 而不是 sm20,它会再次变得更快。由于我现在不应该使用任何新的 sm35 功能,我怎样才能为 sm20 编译而不会有这么大的延迟?我也很好奇是什么导致了这种延迟?机器代码是否即时重新编译为 sm35 代码?

附言。我在 Windows 上运行,但我的一位同事遇到了同样的问题,可能是在 Windows 上。该设备是 Kepler,驱动程序版本 320。

4

1 回答 1

4

是的,机器代码是即时重新编译的。这称为 JIT 编译步骤,它会在机器代码与正在使用的设备不匹配的任何时候发生(并假设可执行文件中存在有效的 PTX 代码。)

您可以在此处了解有关 JIT 编译的更多信息。请注意缓存的讨论,这应该可以在第一次运行后缓解问题。

如果您同时为 sm_20 和 sm_35 指定编译,您可以构建一个在这两种类型的设备上快速运行的二进制/可执行文件,如果您使用的是 sm_20 不支持的 sm_35 功能,您也会收到通知(在编译期间过程)。

于 2013-10-18T15:34:31.833 回答