cuda调试(一)vs2019-windows-Nsight system--nvtx使用,添加nvToolsExt.h文件

这篇具有很好参考价值的文章主要介绍了cuda调试(一)vs2019-windows-Nsight system--nvtx使用,添加nvToolsExt.h文件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

cuda调试

由于在编程过程中发现不同的网格块的结构,对最后的代码结果有影响,所以想记录一下解决办法。

CUDA的Context、Stream、Warp、SM、SP、Kernel、Block、Grid

cuda context (上下文)

context类似于CPU进程上下,表示由管理层 Drive 层分配的资源的生命周期,多线程分配调用的GPU资源同属一个context下,通常与CPU的一个进程对应。

CUDA Stream

CUDA Stream是指一堆异步的CUDA操作,他们按照host代码调用的顺序执行在device上。
Stream维护了这些操作的顺序,并在所有预处理完成后允许这些操作进入工作队列,同时也可以对这些操作进行一些查询操作。
这些操作包括host到device的数据传输,launch kernel以及其他的由host发起由device执行的动作。
这些操作的执行总是异步的,CUDA runtime会决定这些操作合适的执行时机。我们则可以使用相应的cuda api来保证所取得结果是在所有操作完成后获得的。同一个stream里的操作有严格的执行顺序,不同的stream则没有此限制。

CUDA API可分为同步和异步两类,同步函数会阻塞host端的线程执行,异步函数会立刻将控制权返还给host从而继续执行之后的动作。

当我们使用CUDA异步函数与多流(Multi Stream)时,多线程间既可以实现并行进行数据传输与计算,如下图所示。不过需要注意的是, CUDA runtime API默认的default stream是同步串行的,且一个进程内的所有线程都在default stream下,需要显式声明default之外的Stream才可以实现多流并发。
cuda调试(一)vs2019-windows-Nsight system--nvtx使用,添加nvToolsExt.h文件

显卡硬件架构:SM、SP、Warp

具体到nvidia硬件架构上,有以下两个重要概念:

SP(streaming processor):最基本的处理单元,也称为CUDA core。最后具体的指令和任务都是在SP上处理的。GPU进行并行计算,也就是很多个SP同时做处理。

SM(streaming multiprocessor):多个SP加上其他的一些资源组成一个SM,也叫GPU大核,其他资源如:warp scheduler,register,shared memory等。SM可以看做GPU的心脏(对比CPU核心),register和shared memory是SM的稀缺资源。CUDA将这些资源分配给所有驻留在SM中的threads。因此,这些有限的资源就使每个SM中active warps有非常严格的限制,也就限制了并行能力。如下图是一个SM的基本组成,其中每个绿色小块代表一个SP。
cuda调试(一)vs2019-windows-Nsight system--nvtx使用,添加nvToolsExt.h文件
每个SM包含的SP数量依据GPU架构而不同,Fermi架构GF100是32个,GF10X是48个,Kepler架构都是192个,Maxwell都是128个。当一个kernel启动后,thread会被分配到很多SM中执行。大量的thread可能会被分配到不同的SM,但是同一个block中的thread必然在同一个SM中并行执行。

Warp调度

一个SP可以执行一个thread,但是实际上并不是所有的thread能够在同一时刻执行。Nvidia把32个threads组成一个warp,warp是调度和运行的基本单元。warp中所有threads并行的执行相同的指令。一个warp需要占用一个SM运行,多个warps需要轮流进入SM。由SM的硬件warp scheduler负责调度。目前每个warp包含32个threads(Nvidia保留修改数量的权利)。所以,一个GPU上resident thread最多只有 SM*warp个

同一个warp中的thread可以以任意顺序执行,active warps被SM资源限制。当一个warp空闲时,SM就可以调度驻留在该SM中另一个可用warp。在并发的warp之间切换是没什么消耗的,因为硬件资源早就被分配到所有thread和block,所以新调度的warp的状态已经存储在SM中了。

每个SM有一个32位register集合放在register file中,还有固定数量的shared memory,这些资源都被thread瓜分了,由于资源是有限的,所以,如果thread比较多,那么每个thread占用资源就叫少,thread较少,占用资源就较多,这需要根据自己的要求作出一个平衡。

软件架构:Kernel、Grid、Block

上面的context与stream类似进程、线程的概念,具体到我们如何调用GPU上的线程实现我们的算法,则是通过Kernel实现的。在GPU上调用的函数成为CUDA核函数(Kernel function),核函数会被GPU上的多个线程执行。我们可以通过如下方式来定义一个kernel:

func_name<<<grid, block>>>(param1, param2, param3....);

cuda调试(一)vs2019-windows-Nsight system--nvtx使用,添加nvToolsExt.h文件
Grid:由一个单独的kernel启动的所有线程组成一个grid,grid中所有线程共享global memory。Grid由很多Block组成,可以是一维二维或三维。

Block:一个grid由许多block组成,block由许多线程组成,同样可以有一维、二维或者三维。block内部的多个线程可以同步(synchronize),可访问共享内存(share memory)。

CUDA中可以创建的网格数量跟GPU的计算能力有关,可创建的Grid、Block和Thread的最大数量如下所示:
cuda调试(一)vs2019-windows-Nsight system--nvtx使用,添加nvToolsExt.h文件
以上是引用:

https://zhuanlan.zhihu.com/p/266633373

cuda调试(一)vs2019-windows-Nsight system--nvtx使用,添加nvToolsExt.h文件
cuda调试(一)vs2019-windows-Nsight system--nvtx使用,添加nvToolsExt.h文件
通过deviceQuery可以知道,每个block中只有1024个thread,而32 × 32× 32 = 32768 > 1024:会出现以下错误,运行时参数传递得太大了,出现这类问题后,cuda仍可继续提供服务,仅单纯拒绝了启动核函数

cudaErrorInvalidConfiguration = 9,"invalid configuration argument"

所有CUDA kernel的启动都是异步的,当CUDA kernel被调用时,控制权会立即返回给CPU。在分配Grid、Block大小时,我们可以遵循这几点原则

  1. 保证block中thread数目是32的倍数。这是因为同一个block必须在一个SM内,而SM的Warp调度是32个线程一组进行的。
  2. 避免block太小:每个blcok最少128或256个thread。
  3. 根据kernel需要的资源调整block,多做实验来挖掘最佳配置。
  4. 保证block的数目远大于SM的数目。

配置Nsight system

低开销的性能分析工具,Nvidia nsight Systems旨在提供开发人员优化其软件所需的洞察力。在工具中可视化活动数据,以帮助用户调查瓶颈,避免推断误报,并以更高的性能提高概率进行优化。用户将能够识别问题,例如GPU不足、不必要的GPU同步、CPU并行化不足,甚至目标平台的CPU和GPU之间的算法异常。

  1. 打开该程序
  2. 上面的 command line with arguments中填写 要调试的cuda项目的exe文件我的目录是F:\E_cuda\test1\testCUDA\x64\Debug\testCUDA.exe
    注意这个路径需要是全英文的
    3.下面的 working directory 填写 cuda中的Debug文件,我的cuda中的默认目录是
    C:\ProgramData\NVIDIA Corporation\CUDA Samples\v11.0\bin\win64\Debug

cuda调试(一)vs2019-windows-Nsight system--nvtx使用,添加nvToolsExt.h文件

F:\E_cuda\test1\testCUDA\x64\Debug\testCUDA.exe

cuda调试(一)vs2019-windows-Nsight system--nvtx使用,添加nvToolsExt.h文件
然后start就行了
cuda调试(一)vs2019-windows-Nsight system--nvtx使用,添加nvToolsExt.h文件
但是还不知道怎么去看具体的kernel

cuda调试(一)vs2019-windows-Nsight system--nvtx使用,添加nvToolsExt.h文件
这个Report包含5部分内容:

  1. Analysis Summary (分析总结,内容非常全面,包含了Target的详细信息,Process summary, Module summary, Thread summary, Environment Variables, CPU info, GPU info等等)
  2. Timeline View (展示CPU/GPU各个核的工作时间线,一般用来来勘察模型训练或者推理的瓶颈在哪里)
  3. Diagnostics Summary (顾名思义,诊断总结。就是程序在运行中做了什么,有什么warning , error,或者message的,都在这里汇总)
  4. Symbol Resolution Logs(暂时不知道是干嘛的)
    Files (执行结果的log 文件:pid_stdout.log,& 执行出错的log 文件pid_stderr.log)

简单看看Timeline view。如下,这里有三个CPU核在工作,它们启动和停止的时间可以从timeline上看到。还可以看到下面有三个Thread的时间线。
cuda调试(一)vs2019-windows-Nsight system--nvtx使用,添加nvToolsExt.h文件

https://blog.csdn.net/NXHYD/article/details/112915968

这位博主的图和说明

我在b站上找的视频发现别人用的是 nsight system profiles 这个,(还没找到是啥,只有一个visoul profiler—需要java的环境)但是他讲的时候又说是NVTX,有点晕

https://www.bilibili.com/video/BV13w411o7cu/?spm_id_from=333.337.search-card.all.click&vd_source=0a4d8c47345ce0df71cd9cdb01575134

就是这个
以下是我使用visoul profiler—的报错
cuda调试(一)vs2019-windows-Nsight system--nvtx使用,添加nvToolsExt.h文件
英伟达的官方文档关于nsight-system的

https://docs.nvidia.com/nsight-systems/2020.3/profiling/index.html

NVTX是一种CUDA Profiler的工具

可以用于在CUDA程序中进行标记和注释,以便更好地理解和优化程序的性能。以下是使用NVTX的一些示例代码和步骤:

  1. 在CUDA代码中包含nvToolsExt.h文件。
    #include <nvToolsExt.h>
    解决:右键cuda项目——属性——配置属性——C/C++——常规——附加包含目录
    可能遇到的问题:无法在 Visual Studio 中打开 nvToolsExt.h 文件,可能是因为 Visual Studio 找不到 CUDA 的 include 目录。

错误示范
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\include
but我这里没有这个头文件
cuda调试(一)vs2019-windows-Nsight system--nvtx使用,添加nvToolsExt.h文件
C:\ProgramData\NVIDIA Corporation\CUDA Samples\v11.0\common\inc
这个目录下也没有
cuda调试(一)vs2019-windows-Nsight system--nvtx使用,添加nvToolsExt.h文件

正确示范 可以通过在vs项目属性里面进行设置

第一步:在项目属性页,打开vc++目录(c程序是c目录会略微有些不同),打开外部包含目录,输入:$(NVTOOLSEXT_PATH)\include
cuda调试(一)vs2019-windows-Nsight system--nvtx使用,添加nvToolsExt.h文件
第二步,打开链接器–常规----附加库目录,输入:$(NVTOOLSEXT_PATH)\lib\$(Platform)
cuda调试(一)vs2019-windows-Nsight system--nvtx使用,添加nvToolsExt.h文件
第三步,打开链接器–输入—附加依赖项,输入:nvToolsExt64_1.lib
cuda调试(一)vs2019-windows-Nsight system--nvtx使用,添加nvToolsExt.h文件
在 .cu 文件中注释代码,还应该设置:打开CUDA C/C+±-common—附加依赖项,输入:$(NVTOOLSEXT_PATH)\include
cuda调试(一)vs2019-windows-Nsight system--nvtx使用,添加nvToolsExt.h文件
cuda调试(一)vs2019-windows-Nsight system--nvtx使用,添加nvToolsExt.h文件
英伟达官方NVTX文档

https://docs.nvidia.com/nsight-visual-studio-edition/nvtx/index.html

  1. 在需要标记的代码块前后插入标记函数。
    nvtxRangePushA("My Code Block"); // 开始标记代码块 nvtxRangePop(); // 结束标记

  2. 可以使用nvtxEventAttributes_t结构体自定义标记的颜色和描述等信息。

nvtxEventAttributes_t eventAttrib = {0};
eventAttrib.version = NVTX_VERSION;
eventAttrib.size = NVTX_EVENT_ATTRIB_STRUCT_SIZE;
eventAttrib.colorType = NVTX_COLOR_ARGB;
eventAttrib.color = 0xFF00FF00;
eventAttrib.messageType = NVTX_MESSAGE_TYPE_ASCII;
eventAttrib.message.ascii = "My Custom Event";
nvtxRangePushEx(&eventAttrib);
// 代码块
nvtxRangePop();

  1. 还可以使用nvtxMarkA()函数在代码中插入注释。
nvtxMarkA("My Comment");

  1. 在运行程序时,可以使用nvprof或Nvvp等工具来查看标记和注释。
    注意:使用NVTX可能会对程序的性能产生一定的影响

cuda运行时间记录

在python里面
异步计算的结果是没有同步的时间测量是不准确的。要获得精确的测量值,应该在测量前调用 torch.cuda.synchronize(),或者使用 torch.cuda.Event 记录时间,如下所示:

 
 
start_event = torch.cuda.Event(enable_timing=True)
end_event = torch.cuda.Event(enable_timing=True)
start_event.record()
 
# 在这里运行一些东西
 
end_event.record()
torch.cuda.synchronize() # 等待事件被记录!
elapsed_time_ms = start_event.elapsed_time(end_event)
 

https://blog.csdn.net/dedell/article/details/121574306

先这样,后续会补充,老师让我去搞二维的共享内存的程序,祝我好运!!!文章来源地址https://www.toymoban.com/news/detail-436560.html

到了这里,关于cuda调试(一)vs2019-windows-Nsight system--nvtx使用,添加nvToolsExt.h文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • VS2019如何调试C语言程序(监视操作)

            在我们编写代码的时候我们经常是遇到与答案不符啊,数组越界啊等问题,有的时候我们的错误在一些不显眼的地方,我们发现不了,但是我们可以确定是那一部分出现了错误,这个时候我就需要去调试。         小白曾经就有一段时间很煎熬,并不知道调试

    2023年04月09日
    浏览(35)
  • visual studio 2019安装Nsight无菜单项

    visual studio 2019 community版 nsight visual studio edition 最新版(2022.1)安装后无法找到nsight的菜单 解决的办法: 到这个连接去下载 Nsight Developer Tools Integration, 或者从vs 2019的扩展菜单里找到在线搜索nsight安装,然后就可以在扩展里面看到了。 https://marketplace.visualstudio.com/items?itemNa

    2024年02月08日
    浏览(43)
  • 解决 VS2019 调试 QT 工程时,无法查看 QT 变量的值

    本地环境: windows10 / CMake 生成的 VS2019 工程,使用 Qt5.15.2 产生问题: 调试时,QString 不提示真实内容 解决方法: 1. 在 VS 扩展菜单, 管理扩展    安装 Qt Vs Tools 工具 2. 查找 qt5.natvis.xml 文件 ( Everything 找一下, 我本地找到好几个) C:Users*****AppDataLocalMicrosoftVisualStudio16.0_e1fd65e3Exte

    2024年02月05日
    浏览(64)
  • VS2019+QT5.12.9环境下,调试QString无显示解决

    1、搜索 qt5.natvis.xml 文件,路径一般为C:UsersieskongAppDataLocalMicrosoftVisualStudio16.0_cb8bc8a7Extensionsoih0nd55.5jrqt5.natvis.xml,【建议使用Everything这个工具搜索] 2、复制到C:Program Files (x86)Microsoft Visual Studio2019EnterpriseCommon7PackagesDebuggerVisualizers目录下并重命名为qt5.natvis即可(如果

    2024年02月09日
    浏览(40)
  • 音视频源码调试前准备vs2019+qt5.15.2搭建可调试环境

    安装vs2019+qt,并且在windows环境上安装ffmpeg,尝试使用qt+cdb进行调试,尝试使用vs2019加载qt的程序。 安装VS2019+5.12.2qt环境,并进行测试。 1:安装Visual Studio 2019, a.从官网下载,或者vs2019社区版本下载地址 https://www.jb51.net/softs/700418.htm ====》 安装时必须勾选 Desktop development with C++

    2024年02月05日
    浏览(56)
  • windows驱动开发-vs2019-vs2022 WDK开发环境搭建

    QQ群: 852283276 微信: arm80x86 微信公众号: 青儿创客基地 B站:主页 https://space.bilibili.com/208826118 好久不开发Windows驱动,现在又变天了,微软的工具更新的非常快,Visual Studio和WDK都发了新版本,推荐安装新版本,但如果非想安装老版本,也可以。Visual Studio 2022不支持Windows 1

    2024年02月04日
    浏览(72)
  • CUDA编程第一章:windows下安装visual studio 2019+CUDA10.2的整体图文流程

    去年虽然看了CUDA编程的基础知识(没学完つ﹏⊂),但是没有整理成笔记,并且一直没有使用,导致忘了好多。今年打算重新再把CUDA的基础知识学习一边,并进行总结梳理,记录成文,便于后续的复习。 本篇博客是CUDA编程系列笔记的开篇,我打算先介绍下搭建CUDA编程环境

    2024年02月15日
    浏览(47)
  • Colmap编译教程及笔记 [Windows+VS2019+Vcpkg]

    Windows系统下COLMAP的编译可以分为三部分:(1)手动下载安装Boost、Qt、CGAL、CUDA(Boost和CGAL也可以用vcpkg安装);(2)利用vcpkg安装glew、freeimage、ceres等库(3)最后在colmap源代码目录下的build文件夹打开cmd,输入cmake命令生成解决方案 CMake、Git、Visual Studio 2019、Vcpkg等提前安装

    2023年04月08日
    浏览(106)
  • C++:VS2019 Windows SDK 10损坏重装

    不知道什么原因导致的这个情况 C:Program Files (x86)Microsoft Visual Studio2019CommunityVCToolsMSVC14.29.30037includeyvals.h(12,10): fatal error C1083: 无法打开包括文件: “crtdbg.h”:  网上一查,应该是SDK的毛病。 我也不清楚,因为之前刚刚安装了一个软件SW,安装过程中失败了(SW垃圾,气人

    2024年02月08日
    浏览(41)
  • Windows环境下C++ 安装OpenSSL库 源码编译及使用(VS2019)

    参考文章 https://blog.csdn.net/xray2/article/details/120497146 之所以多此一举自己写多一篇文章,主要是因为原文内容还是不够详细。而且我安装的时候碰到额外的问题。 一般情况下,引入别人的库,要么把代码直接搞进去,一起编译。要么引入库和头文件(就像MYSQL那样),都不复杂

    2024年02月14日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包