C++ 使用Nsight系统跟踪定制CUDA内核
我的工作是使用C++20和CUDA11实现库。这个库是从Python通过交换JSON字符串的C API通过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,以获取更多信息 但我得到的只是众多内核中的一个。输出如下所示:
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。您有一些复杂的多进程场景,并且只分析其中一个进程。我将试图以大致相同的顺序来证明或反驳这些理论。谢谢你,事实证明,使用非终止程序的隐式停止并不能很好地工作。