Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用Nsight系统跟踪定制CUDA内核_C++_Cuda_Profiling_Nvidia_Nsight - Fatal编程技术网

C++ 使用Nsight系统跟踪定制CUDA内核

C++ 使用Nsight系统跟踪定制CUDA内核,c++,cuda,profiling,nvidia,nsight,C++,Cuda,Profiling,Nvidia,Nsight,我的工作是使用C++20和CUDA11实现库。这个库是从Python通过交换JSON字符串的C API通过ctypes调用的。我们使用Clang11编译它 为了配置代码,我已经向C++代码中添加了很多NVTX范围。这对我使用Nsight系统很有效,当使用nsys profile-t nvtx…收集数据时,我可以看到范围堆栈及其手动选择的名称。这并没有告诉我任何关于GPU的事情。所以我指定了nvtx、cuda、cublas、cudnn,以获取更多信息 但我得到的只是众多内核中的一个。输出如下所示:

我的工作是使用C++20和CUDA11实现库。这个库是从Python通过交换JSON字符串的C API通过
ctypes
调用的。我们使用Clang11编译它

为了配置代码,我已经向C++代码中添加了很多NVTX范围。这对我使用Nsight系统很有效,当使用

nsys profile-t nvtx…
收集数据时,我可以看到范围堆栈及其手动选择的名称。这并没有告诉我任何关于GPU的事情。所以我指定了
nvtx、cuda、cublas、cudnn
,以获取更多信息

但我得到的只是众多内核中的一个。输出如下所示:

可以看到漂亮的NVTX上下文,可以看到对CUDAAPI的调用(memcpy等)。但是只显示了一个内核,我用红色箭头标记了它

我们有一堆不同的内核,并从
.cu
文件中使用
语法启动它们


感觉上我缺少了
nsys
的跟踪标志,CUDA代码的一些编译选项,或者内核代码的一些代码注释,比如NVTX。我该怎么做才能使我的自定义内核显示在配置文件中?

问题可能是我没有正确停止数据收集,我们的程序是一个交互式服务器,其中一个以SIGINT停止。可能中断后数据没有正确存储

我在代码中添加了对探查器API的调用,以便在主循环完成后显式调用
cudaProfilerStop()
。我用了一个小的RAII包装器,这样它甚至可以与SIGINT一起工作

#包括
类别利润范围{
公众:
ProfilingRange(){
cudaprofilerst();
}
~ProfilingRange(){
cudaProfilerStop();
}
};

nsys profile
命令行中,我指定了
--capture range=cudaProfilerApi
,它似乎工作正常。现在出现了很多内核,我可以了解更多有关该系统的信息。

您正在完成所需的一切。这方面的一个证据是,您正在探查器中看到内核执行。如果没有一个更完整的例子,我认为不太可能有人能够找出问题所在。有些可能性是1。你认为应该调用的内核实际上没有被调用,2。也许通过探查器的start和stop语句,您意外地禁用了评测功能3。您有一些复杂的多进程场景,并且只分析其中一个进程。我将试图以大致相同的顺序来证明或反驳这些理论。谢谢你,事实证明,使用非终止程序的隐式停止并不能很好地工作。