我每次开机之后,第一次跑CUDA的程序的时候,总是很慢。
跑一次之后,速度就正常了。
这是为什么?
CUDA需要加载什么全局的东西么?
楼主您好,
(1)如果您是使用的linux(R)系列操作系统,那么可能是因为第一次运行需要载入显卡驱动。
(2)即使哪怕您使用的是Windows, 第一次运行也要载入您的exe以及dll等。而下次载入,因为有缓存,不必访问磁盘,可能就快了。等等。
我是用Windows系统的。
CUDA内部有什么exe和dll要懒加载么?
有什么推荐的办法可以让他们在程序载入后立即加载么?
我的需求是这样。
我的程序是桌面级的程序,有用户交互的。
我这边用CUDA是为了做到实时的用户交互而加速用户输入的数据的处理。
但是CUDA懒加载的话,用户的第一次输入反应会特别慢。
我想让程序跑起来之后,立刻开一个子线程,开始CUDA的懒加载。不等到要处理用户的输入的时候才懒加载。
好像可以程序一开始,就运行一次数据传输+一个无实际用处的kernel(如add之类的)。这样就可以在正式的程序运行之前,加载完需要的组件。
仅供参考~
楼主您好,根据您的1#现象看,您主要是开机后第一次运行慢,那么您在3#的某些估计可能不对。
(1)此时,不是CUDA的lazy initialization导致的缓慢,因为这个每次几乎都一个速度。(这个一般翻译为,延迟初始化)
(2)此时,我估计是需要将您的cuda runtime dll等进行延迟载入,而又是第一次才导致的缓慢(Lazy load, 一般翻译为延迟加载,您也可以继续使用您的"懒加载“的说法)。
如果您的桌面程序不一定什么时候才会使用cuda的kernel, 那么您可以尝试在固定时刻进行记载,以提高用户友好度,那么对您的建议:
(1)在主UI界面启动后的10秒内,使用一个backgroud thread, 进行一次空kernel调用,然后同步并cudaDeviceReset(), 这样用户觉察不到,但是会导致您显式的载入runtime dll等以及OS会进行磁盘缓冲,然后当正常装态,例如30秒后,用户正常的使用其他kernel, 可能OS无需再次从磁盘载入,从而提高了速度。
(2)您可以使用一个简单的小程序,里面只有简单的上文那种kernel<<<…>>>;cudaDeviceSynchronize(); exit(…); 作为您的自启动项目,那么它将会训练OS的对磁盘文件的读取和缓冲,从而在系统启动完毕后,用户开启您的cuda项目(和这个小程序无关),会得到更快的启动速度。
这个方式也是office之类的软件喜欢用的。
(3)如果可能,请考虑Windows 7系列操作系统,该操作系统引入了SuperPrefetch机制。我简单的说下这个,例如您的exe分别在启动后使用a.dll文件从字节偏移0到200K, 以及600K到900K, 以及b.dll文件从字节偏移40到500K, 然后a.dll又访问了400K到500K偏移。那么SuperPrefetch机制将自动在您的exe启动后,预读a.dll的0-200K, 600-900K, b.dll的40-50K, a.dll的400K-500K内容,哪怕您现在还不需要使用它们。
SuperPrefetch可能需要多启动几次您的程序以进行访问模型分析和余热。以及,如果可能,上SSD是个不错的选择(SSD下此功能无效,也不需要)。
这是我根据您的1#和3#进行的分析,并给出的可能的建议。
感谢您来访CUDAZone China,祝您愉快。