我在基于Xeon的系统上使用CUDA 8.0和GTX Titan X(GM 200)。它工作正常,但是 - 与我家里的弱GTX 600系列卡相比,我得到了很长的开销。具体来说,当我在时间轴上时,我发现对cudaGetCacheConfig()
的调用始终使CUDA运行时API花费了大量的时间:530-560毫秒,或超过0.5秒。这个,而其他电话不需要那么多。例如,cuDeviceGetTotalMem
需要0.7毫秒(也是相当多的时间,但是要少一个数量级),而cuDeviceGetAttribute
(可能仅限于主机端代码)需要0.031毫秒。 / p>
为什么会这样?或者说 - 怎么可能呢?我可以做些什么来改善这种情况吗?
备注:
cudaGetCacheConfig()
之后调用cudaGetDeviceCount()
,但可能(不是100%确定)在任何其他运行时API调用之前调用。cudaGetDeviceProperties()
电话前加cudaGetCacheConfig()
电话,前者需要约0.6毫秒,后者仍需要0.5秒(我上次测量时为581毫秒)。答案 0 :(得分:0)
TL; DR:CUDA懒惰初始化(正如@RobertCrovella建议的那样)。
@RobertCrovella在dupe bug中解释:
我得到这种行为的机器有256 GB的内存,是我家用机器的32倍; GPU本身有12 GB,是家用机器上GPU的4倍。这意味着我可以 - 不幸的是 - 期望CUDA驱动程序和/或运行时API的初始化时间比在我的家用机器上要长得多。部分或全部初始化是以一种懒惰的方式执行 ,在我的情况下恰好是在调用CUDA初始化通常包括建立UVM,其涉及设备和主机存储器映射的协调。如果您的服务器具有比PC更多的系统内存,则可以解释初始化时间的差异。操作系统也可能有效,最后GPU的内存大小可能会产生影响。
cudaGetCacheConfig()
时;我想其他调用只需要一些初始化(虽然不清楚原因)。