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

cudaGetCacheConfig需要0.5秒-如何/为什么?,cuda,nvidia,Cuda,Nvidia,我正在基于Xeon的系统上使用CUDA 8.0,该系统带有GTX Titan X(GM 200)。它工作得很好,但是-与我在家里使用的GTX 600系列卡相比,我的开销很长。具体来说,当我调用timeline时,我发现调用cudaGetCacheConfig()会持续占用CUDA运行时API惊人的时间:530-560毫秒,或超过0.5秒。这个,而其他的电话不需要那么多。例如,cudevicegettotalem需要0.7毫秒(也是相当长的一段时间,但要少一个数量级),而cuDeviceGetAt

我正在基于Xeon的系统上使用CUDA 8.0,该系统带有GTX Titan X(GM 200)。它工作得很好,但是-与我在家里使用的GTX 600系列卡相比,我的开销很长。具体来说,当我调用timeline时,我发现调用
cudaGetCacheConfig()
会持续占用CUDA运行时API惊人的时间:530-560毫秒,或超过0.5秒。这个,而其他的电话不需要那么多。例如,
cudevicegettotalem
需要0.7毫秒(也是相当长的一段时间,但要少一个数量级),而
cuDeviceGetAttribute
(可能仅限于主机端代码)需要0.031毫秒

为什么会这样?或者更确切地说,这怎么可能呢?我能做些什么来改善这种情况吗

注意事项:

  • cudaGetDeviceCount()
    之后调用
    cudaGetCacheConfig()
    ,但可能(不是100%确定)不会在任何其他运行时API调用之前调用
  • 如果在调用
    cudaGetCacheConfig()
    之前先调用
    cudaGetDeviceProperties()
    ,则前者需要约0.6毫秒,而后者仍然需要超过0.5秒(上次测量时为581毫秒)

    • TL;DR:CUDA惰性初始化(如@RobertCrovella所示)。

      @RobertCrovella在文章中解释:

      CUDA初始化通常包括建立UVM,这涉及协调设备和主机内存映射。如果您的服务器的系统内存比您的PC多,这可能是造成初始化时间差异的原因之一。操作系统可能也会有影响,最后GPU的内存大小可能会有影响


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

      是不是正在计时的程序中的第一个cuda运行时API调用?@RobertCrovella:否,请参阅edit。如果在程序中足够早,它可能仍在吸收一些cuda惰性初始化开销。在调用
      cudaDeviceSynchronize()
      之后,尝试将
      cudaGetCacheConfig()
      放在代码末尾附近的某个地方,看看探查器报告的时间是否短得多。@RobertCrovella:紧接着第一个调用的第二个调用需要1.574 usec。节目结束时的第三个电话似乎没有出现在时间表上。CUDA可能会有相当长的启动开销。这些将因机器配置而不同,例如GPU的数量,系统内存的大小可能会影响启动开销。如果这就是正在发生的事情,那么在
      cuda
      标签上会有许多与您类似的问题。