当前位置: 首页 > news >正文

CUDA编程(六):代码分析与调试

CUDA编程(六):代码分析与调试

  • 代码分析与调试方法
    • 使用printf打印变量信息
    • 使用CUDA的错误检查功能
    • 使用CUDA-GDB进行调试
    • 使用Nsight进行调试
    • 使用nvprof / nvvp工具
  • 参考文献

代码分析与调试方法

CUDA代码的运行时可能会遇到内存溢出、内存非法访问、核函数出错等一系列问题,需要进行Debug调试。在CUDA代码的分析与调试过程中,通常可以采用以下几种方法。

使用printf打印变量信息

在CUDA程序中,可以使用printf()函数打印变量信息。但是需要注意,由于CUDA是并行计算架构,因此在使用printf()函数时需要谨慎,避免对性能造成过大的影响。

使用CUDA的错误检查功能

在CUDA中,可以使用错误处理函数检查CUDA程序哪一个环节出现错误。在每次CUDA函数调用后,使用该函数进行检查,并打印错误信息以帮助诊断问题。另外,也可以使用cuda-memcheck工具来检查内存错误。

CUDA编程中错误处理相关的函数一共有4个:

// cudaGetErrorName函数接受一个错误码,返回错误名称
__host__ __device__ const char* cudaGetErrorName(cudaError_t error)
// cudaGetErrorString函数接受一个错误码,返回错误描述
__host__ __device__ const char* cudaGetErrorString(cudaError_t error)
// cudaGetLastError函数返回上一次CUDA runtime调用时的错误码,并将CUDA错误码置为cudaSuccess
__host__ __device__ cudaError_t cudaGetLastError(void)
// cudaPeekAtLastError函数与上面功能一样,但不会重置CUDA的错误信息
__host__ __device__ cudaError_t cudaPeekAtLastError(void)

使用CUDA-GDB进行调试

CUDA-GDB是一个基于命令行的调试工具,可用于调试CUDA C/C++应用程序。使用CUDA-GDB可以设置断点、单步调试、查看变量值等。需要在编译时使用-g、-G选项来生成可调试版本。CUDA-GDB使用方法如下:

# 编译程序的时候我们使用nvcc编译器,将其编译成可调式版本;-g 表示将CPU代码(host)编译成可调式版本,-G表示将GPU代码(kernel)编译成可调式版本。
nvcc -g -G XXX.cu -o XXX
# 进入调试器
cuda-gdb XXX
# run执行
run

使用Nsight进行调试

Nsight 开发工具套件提供深入的跟踪、调试、评测和其他分析,以优化跨 NVIDIA GPU 和 CPU 的复杂计算应用程序,包括 x86、ARM 和 Power 体系结构。一般在装CUDA时,在图形界面已安装好Nsight。用终端打开Nsight编译器,它可以直接对写好程序进行编译和Debug。关于如何使用Nsight调试程序,可以参考链接。

使用nvprof / nvvp工具

NVIDIA nvprof / nvvp工具是英伟达N卡GPU编程中用于观察的利器。全称是NVIDIA Visual Profiler,是由2008年起开始支持的性能分析器。它具有交互性好,利于使用的优点,并且可用于分析CUDA应用程序的性能瓶颈和优化方案,其在安装好CUDA toolkit后方可使用。

在CUDA程序调试过程中,Visual Profiler提供每个CUDA函数调用的时间分析,它还能给出如何调用内核函数以及存储器的使用情况等,有助于定位瓶颈可能出现的位置,并详细解释如何调用内核等。

记录运行日志时使用命令nvprof,可视化显示日志时使用命令nvvp。如果只想对某一段代码进行分析,在目标代码段前后加上 cudaProfilerStart() 和 cudaProfilerStop()。

# 使用 nvprof 在命令行查看分析结果
nvprof -o out.nvvp XXX
# 对于生成的 out.nvvp 文件,需要在使用 nvvp 进行查看。

以上是一些常用的CUDA代码调试的方法,希望对您有所帮助,欢迎在评论区留言。

参考文献

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

相关文章:

CUDA编程(六):代码分析与调试

CUDA编程(六):代码分析与调试 代码分析与调试方法使用printf打印变量信息使用CUDA的错误检查功能使用CUDA-GDB进行调试使用Nsight进行调试使用nvprof / nvvp工具 参考文献 代码分析与调试方法 CUDA代码的运行时可能会遇到内存溢出、内存非法…...

身份鉴别解读与技术实现分析(1)

6.1.4.1 身份鉴别 本项要求包括: a) 应对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换; b) 应具有登录失败处理功能,应配置并启用结束会话、限制非法登录次数和当登录连接超时自动退出等相关措施 在等级保护体系中,级别越高…...

为什么说7.38万的比亚迪海鸥比仰望更重要

出品 | 何玺 排版 | 叶媛 售价7.38万元起步、速度却能上130迈。注意看,这就是A0级轿车中的“新皇”—比亚迪海鸥。 出乎车圈事前的意料,海鸥这款A0级车型,在上海车展里获得的人气和追捧并不逊色于百万豪车仰望。 01 比亚迪海鸥&#xff0…...

【LLM】低成本部署大语言模型, 并且还能达到部署在GPU上差不多的效果

目录 前言 部署 效果 问题1:人类为什么需要睡觉? 问题2:世界上最高的山峰是什么? 前言 点进来看本文的应该都知道模型对硬件的要求很高, 那我也不废话了, 直接安排最近发现的一个开源项目, 它可以帮助我们降低部署模型的成…...

Doris(25):Doris的函数—Bitmap函数

1 BITMAP_AND(BITMAP lhs, BITMAP rhs) 计算两个输入bitmap的交集,返回新的bitmap. select bitmap_count(bitmap_and(to_bitmap(1), to_bitmap(2))) cnt; select bitmap_count(bitmap_and(to_bitmap(1), to_bitmap(1))) cnt; 2 BITMAP_CONTAINS(BITMAP bitmap, BIGINT input…...

简单分享微信小程序上的招聘链接怎么做

招聘小程序的主要用户就是企业招聘端和找工作人员的用户端,下面从这两个端来对招聘小程序开发的功能进行介绍。 企业端功能 1、岗位发布:企业根据自身岗位需求,在招聘app上发布招聘岗位及所需技能。 2.简历筛选:根据求职者提交的简历选择合适的简历,并对公开发布的简历进行筛…...

【英语】大学英语CET考试,翻译部分(修饰后置,定语从句,插入语,多动句,无主句)

文章目录 3大知识点与出题形式1、修饰后置(使用介词)2、修饰后置(定语从句(被逼无奈)/which(非限制性,加高级))3、修饰后置(插入语或同位语(只有1…...

设计模式——代理模式

导航: 【黑马Java笔记踩坑汇总】JavaSEJavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成在线设计模式牛客面试题 目录 1、代理模式的基本介绍 2、静态代理 3、JDK动态代理 4、Cglib 代理 5、代理模式 的变体(应用场景) 1、…...

Shiro-721---漏洞复现

漏洞原理 Shiro rememberMe 反序列化远程代码执行漏洞 由于 Apache Shiro cookie 中通过 AES-128-CBC 模式加密的 rememberMe 字段存 在问题,用户可通过 Padding Oracle 加密生成的攻击代码来构造恶意的 rememberMe 字段,并重新请求网站,进…...

Linux【模拟实现C语言文件流】

✨个人主页: 北 海 🎉所属专栏: Linux学习之旅 🎃操作环境: CentOS 7.6 阿里云远程服务器 文章目录 🌇前言🏙️正文1、FILE 结构设计2、函数使用及分析3、文件打开 fopen4、文件关闭 fclose5、缓…...

APK文件结构

文件结构 assets文件用来存放需要打包到Android 应用程序的静态资源文件,例如图片资源文件,JSON配置文件,渠道配置文件,二进制数据文件,HTML5离线资源文件等 与res/raw目录不同的数,assets目录支持任意深度…...

RabbitMQ死信队列延迟交换机

RabbitMQ死信队列&延迟交换机 1.什么是死信 死信&死信队列 死信队列的应用: 基于死信队列在队列消息已满的情况下,消息也不会丢失实现延迟消费的效果。比如:下订单时,有15分钟的付款时间 2. 实现死信队列 2.1 准备E…...

武忠祥老师每日一题||不定积分基础训练(六)

解法一: 求出 f ( x ) , 进而对 f ( x ) 进行积分。 求出f(x),进而对f(x)进行积分。 求出f(x),进而对f(x)进行积分。 令 ln ⁡ x t , 原式 f ( t ) ln ⁡ ( 1 e t ) e t 令\ln xt,原式f(t)\frac{\ln (1e^t)}{e^t} 令lnxt,原式f(t)etln(1et)​ 则 ∫ f ( x ) d…...

C语言结构体详解

结构体是C语言中的一种高级数据类型,它可以将不同的数据类型组合在一起,形成一个自定义的数据类型。结构体为程序员提供了一种组织数据的方式,它为程序开发带来了极大的灵活性和扩展性。 C语言中的结构体定义如下: struct 结构体…...

非盲去模糊简单介绍

文章目录 非盲去模糊简单介绍基于频域的方法1. Wiener滤波器2. 逆滤波器和半正定滤波器 基于空域的方法1. 均值滤波器2. 高斯滤波器3. 双边滤波器 基于偏微分的方法1. 非线性扩散滤波2. 全变分模型3. Laplacian正则化模型 振铃效应应用总结 非盲去模糊简单介绍 非盲去模糊是一…...

C语言动态内存管理与文件操作:打造高效通讯录

本篇博客会讲解如何使用C语言实现一个通讯录。实现通讯录的过程中,会大量用到C语言的知识点,包括但不限于:函数、自定义类型、指针、动态内存管理、文件操作,这些知识点在我的其他博客中都有讲解过,欢迎大家阅读&#…...

2001-2021年全国30省就业人数数据

2001-2021年全国30省就业人数数据/各省就业人数数据 1、时间:2001-2021年 2、范围:包括30个省市不含西藏 3、指标:就业人数 4、来源:各省NJ、社会统计NJ 5、缺失情况说明:无缺失 6、指标说明: 就业人…...

自然语言处理知识抽取(pkuseg、DDParser安装及使用)

一、分词简介 1.基本概念 分词是自然语言处理中的一个重要步骤,它可以帮助我们将文本分成一个个词语,以便更好地理解和分析文本。在计算机视觉、语音识别、机器翻译等领域,分词都扮演着重要的角色。 目前,常用的分词库包括 jie…...

Linux内核面试知识总结

Linux启动过程 1、主机加电自检,加载BIOS硬件信息 2、读取MBR引导文件 3、引导linux内核 4、启动第一个进程init(进程号永远为1) 5、进度相应的运行级别 6、运行终端,输入用户名和密码 linux系统缺省的运行级别 关机、单机…...

深度学习模型压缩与优化加速

1. 简介 深度学习(Deep Learning)因其计算复杂度或参数冗余,在一些场景和设备上限制了相应的模型部署,需要借助模型压缩、系统优化加速、异构计算等方法突破瓶颈,即分别在算法模型、计算图或算子优化以及硬件加速等层…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

django filter 统计数量 按属性去重

在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性&#xf…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...

push [特殊字符] present

push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

微服务通信安全:深入解析mTLS的原理与实践

🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言:微服务时代的通信安全挑战 随着云原生和微服务架构的普及,服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...