首页 > 解决方案 > NSight 调试在任何内存分配上都非常慢

问题描述

我正在尝试调试使用一些表面对象和 cuda 数组的内核。为此,我将 NVIDIA NSight 与我的 VS2017 一起使用,在下一代模式下进行调试。但是,在我的内核启动之前,它需要永远(等待 10 分钟,然后取消运行)来运行cudaMallocArray必要的调用。有什么办法吗?

下面的最小代码实际上除了分配所述数组之外什么都不做,它需要永远执行 NSight 调试。

主.cpp:

#include <cuda_runtime.h>

int main() {
  int width = 800;
  int height = 600;

  // Allocate CUDA arrays in device memory
  cudaChannelFormatDesc colorDescription = cudaCreateChannelDesc(8, 8, 8, 8, cudaChannelFormatKindUnsigned);
  cudaChannelFormatDesc depthDescription = cudaCreateChannelDesc(32, 0, 0, 0, cudaChannelFormatKindFloat);
  cudaArray *colorArray;
  cudaMallocArray(&colorArray, &colorDescription, width, height, cudaArraySurfaceLoadStore);
  cudaArray *depthArray;
  cudaMallocArray(&depthArray, &depthDescription, width, height, cudaArraySurfaceLoadStore);

   return 0;
}

更新:

我设法用普通的替换表面cudaMalloc——结果相同。


规格详情:


编辑2:

经过进一步调查,我停止了我的简单程序(cudaMalloc而不是数组)的执行,调用堆栈显示了这一点:

ntdll.dll!00007ffc9b69b1e4() Unknown
kernel32.dll!00007ffc9aecb093() Unknown
kernel32.dll!00007ffc9af096f5() Unknown
nvcuda.dll!00007ffc4037a38c() Unknown
nvcuda.dll!00007ffc4037a532() Unknown
nvcuda.dll!00007ffc40379dae() Unknown
nvcuda.dll!00007ffc40377b05() Unknown
nvcuda.dll!00007ffc40374515() Unknown
nvcuda.dll!00007ffc405cd13b() Unknown
nvcuda.dll!00007ffc40442807() Unknown
nvcuda.dll!00007ffc4054bb84() Unknown
nvcuda.dll!00007ffc4055abed() Unknown
nvcuda.dll!00007ffc4055aee6() Unknown
nvcuda.dll!00007ffc4055a022() Unknown
nvcuda.dll!00007ffc4054b163() Unknown
nvcuda.dll!00007ffc4040b4c7() Unknown
nvcuda.dll!00007ffc4040ea85() Unknown
nvcuda.dll!00007ffc4030588c() Unknown
nvcuda.dll!00007ffc4049a3e8() Unknown
NSightSlow.exe!cudart::contextStateManager::initPrimaryContext(struct cudart::device *) C++
NSightSlow.exe!cudart::contextStateManager::tryInitPrimaryContext(struct cudart::device *) C++
NSightSlow.exe!cudart::contextStateManager::initDriverContext(void) C++
NSightSlow.exe!cudart::contextStateManager::getRuntimeContextState(class cudart::contextState * *,bool) C++
NSightSlow.exe!cudart::doLazyInitContextState(void) C++
NSightSlow.exe!cudart::cudaApiMalloc(void * *,unsigned __int64) C++
NSightSlow.exe!cudaMalloc() C++
> NSightSlow.exe!main() Line 10 C++
NSightSlow.exe!invoke_main() Line 79 C++
NSightSlow.exe!__scrt_common_main_seh() Line 288 C++
NSightSlow.exe!__scrt_common_main() Line 331 C++
NSightSlow.exe!mainCRTStartup() Line 17 C++
kernel32.dll!00007ffc9aec4034() Unknown
ntdll.dll!00007ffc9b6d3691() Unknown

它似乎与第一个 CUDA 函数调用上的(惰性)上下文创建有关。可能与cudaMalloc具体无关。

标签: cudansight

解决方案


我从 NVidia 雇主那里得到反馈,开普勒架构不支持下一代,比如我的 GTX 780。应该有适当的错误消息,但没有。

有一个详细的列表,其中支持以下内容:

https://developer.nvidia.com/nsight-visual-studio-edition-supported-gpus-full-list#SupportedComputeConfigs


推荐阅读