cudaGetCacheConfig需要0.5秒 - 如何/为什么?

时间:2017-02-10 14:55:23

标签: cuda nvidia

我在基于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毫秒)。

1 个答案:

答案 0 :(得分:0)

TL; DR:CUDA懒惰初始化(正如@RobertCrovella建议的那样)。

@RobertCrovella在dupe bug中解释:

  

CUDA初始化通常包括建立UVM,其涉及设备和主机存储器映射的协调。如果您的服务器具有比PC更多的系统内存,则可以解释初始化时间的差异。操作系统也可能有效,最后GPU的内存大小可能会产生影响。

我得到这种行为的机器有256 GB的内存,是我家用机器的32倍; GPU本身有12 GB,是家用机器上GPU的4倍。这意味着我可以 - 不幸的是 - 期望CUDA驱动程序和/或运行时API的初始化时间比在我的家用机器上要长得多。部分或全部初始化是以一种懒惰的方式执行 ,在我的情况下恰好是在调用cudaGetCacheConfig()时;我想其他调用只需要一些初始化(虽然不清楚原因)。