CUDA程序调试的一些经验

news/2024/5/10 1:12:41/文章来源:https://blog.csdn.net/aliexken/article/details/127268797

目录

1. 存储分配检查

2. 变量名检查

3. 核函数输出检查

4. 核函数局部存储空间回收


最近在做一个点云配准的项目,重新把之前就开始玩的CUDA重新拾起来。本来想着稍微改改代码就能够愉快的跑起来,结果改Bug改的我相当上头。结合我之前的帖子和我最近的一些调试经验,总结一个调CUDA程序的一个博客,以方便以后再次遇到类似项目的时候,能够有个参考。简单来说,整个调试可以按照三个步骤来进行,包括存储分配检查,变量名检查,核函数输出检查以及核函数局部存储空间回收。


1. 存储分配检查

为了能够实现并行计算,我们需要把数据从内存移动到显存,并根据显存定义特定的变量名个指针。如果是一维数据相对来说还比较简单,如下所示:

int scale = 100;
std::vector<float> resultMatching(scale, 999.9);
float* resultMatching_Cu;	
cudaMalloc((void**)&resultMatching_Cu, sizeof(float) * resultMatching.size());
cudaMemcpy(resultMatching_Cu, &resultMatching[0], 
sizeof(float) * resultMatching.size(), cudaMemcpyHostToDevice);

这里的resultMatching_Cu就是对应显存的地址,使用cudaMalloc开辟空间,使用cudaMemcpy将数据从内存拷贝到显存,使用cudaMemcpyHostToDevice来指定数据传输的方向。可以看到,仅仅是在显存中定义一个一维数组,就要做这么复杂的操作。这中间只要有一点错误,在核函数中就无法进行正确的计算。最坑的是二维数组,需要更加复杂的操作,有兴趣的朋友可以看下我之前的博客:CUDA如何利用vector实现参数传递

这里对存储的分配非常容易出错,因此我们在对一个存储实体完成对应的空间分配与赋值后,需要进行检查,以及时捕获异常,代码如下:

cudaError_t error_2 = cudaGetLastError();
printf("CUDA error: %s\n", cudaGetErrorString(error_2));

通过对cuda异常情况的分析可以知道在显存分配过程中,是否出现异常。


2. 变量名检查

这里存在一个很容易被忽视的问题。因为我们在定义现存空间的时候,要有一个内存空间的数据容器,将数据拷贝到显存中。一旦调用核函数时,我们使用了内存空间的变量名,而不是显存空间的变量名,那么数据就不能在核函数被获取。由于我们日常养成的编程习惯,导致这样的参数传输错误及容易被忽视。这里有一个小技巧,那就是为显存变量加特定的后缀,以在核函数参数调用的时候进行检查,以避免类似错误的发生。


3. 核函数输出检查

cuda核函数的debug是一个非常上头的过程。原因是我们不能像普通程序那样进行单步调试。这时需要在核函数打印一些数据,以检查数据的计算是否正常,实例如下:

__global__ void CudaTest(float** array2D_Cu,
){const int tid = threadIdx.x + blockDim.x * blockIdx.x;const int tid = threadIdx.x + blockDim.x * blockIdx.x;printf("array2D_Cu[0][0]:%f\n", array2D_Cu[10][1]);
}

请注意,这里的输出需要等到核函数执行完,将数据从显存传到内存后,即调用cudaMemcpy (.... cudaMemcpyDeviceToHost), 才能够看到。


4. 核函数局部存储空间回收

有的时候,你的程序测试没有任何问题,在核函数的打印也没有问题,小规模的并行也没有问题。但是,一旦并行规模变大,传回数据就会出现异常,如下如:

这个问题真心把我整上头了。起初,我怀疑是cuda对数组的长度有要求,如果超过界限,就会造成读取存储的错误。因此,当并行数目较小的时候,对应输入的数据也会因为参数的原因而减小了输入的规模。但是搞笑的是,如果我把核函数里面的计算全部注释掉,发现即使问题规模很大,也不会发生读取存储的错误。那么,问题就出现在核函数的计算里面。

那么,最有可能出现问题的地方就是,在核函数分配了存储空间。当并行规模扩大时,由于所有的线程同时在显存上开辟空间,那么就极有可能产生存储溢出,造成访存错误。理论上来说,我们是不应该在核函数再去开辟较多的额外存储空间的。但是如果必须要开辟空间以解决一些较复杂的计算,那么在线程结束的时候一定要释放存储,尽可能防止存储不够分的。在必要的地方添加了delete以回收存储后,上面的问题就解决了:

以上总结了一些我做CUDA程序调试的一些小经验,希望能帮助到想入坑并行编程的同学。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_589193.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用油猴下载文库

简介 工作中经常需要下载资料&#xff0c;大多数情况下&#xff0c;我们搜索到的资料会在某度文库中&#xff0c;激动的准备存在本地方便以后观摩&#xff0c;又因为页面下方的VIP下载&#xff0c;露出尴尬的笑容。这里介绍两种方式&#xff0c;一种省钱省事&#xff0c;一种免…

matlab之Signal Labeled APP

APP工作流程 &#xff08;1&#xff09;导入数据进信号标注器 &#xff08;2&#xff09;创建或导入信号标注定义 &#xff08;3&#xff09;交互式或自动标记信号 &#xff08;4&#xff09;自定义标注视图 &#xff08;5&#xff09;仪表板 &#xff08;6&#xff09;导出标记…

“箭”指智能家居,卫浴龙头企业箭牌家居即将登陆A股

智哪儿获悉&#xff0c;2022年10月13日&#xff0c;国内卫浴龙头企业箭牌家居集团股份有限公司&#xff08;以下简称箭牌家居&#xff0c;001322.SZ&#xff09;刊登首次公开发行股份发行公告&#xff0c;计划近期在深市主板上市。据披露&#xff0c;箭牌家居本次共计发行新股9…

【Google三驾马车系列】GFS原理总结

这里写自定义目录标题GFS基本框架容错机制Master 的容错机制 &#xff1a;操作日志 Checkpoint ShadowMasterChunkServer的容错机制&#xff1a;复制多个副本 checksum一致性问题元数据的一致性Chunk的强一致性其它重要的技术点总结如何避免单一master的性能瓶颈垃圾延迟删除…

Keithley吉时利2182A/Keysight是德34420A纳伏表测量软件-纳伏表软件

1、软件概述 纳伏表程控软件用于需要更高精度的电压测量和温度测量的应用&#xff0c;操作简便、绘制测量波形图直观。 2、软件功能 ◆纳伏表程控软件可以满足GPIB、RS-232两种连接方式。 ◆纳伏表程控软件可以满足CH1、CH2两通道选择。 ◆纳伏表程控软件可以满足多量程及分辨率…

(附源码)计算机毕业设计ssm河南美丽乡村旅游信息网

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

支付模块-微信支付

目录 接口实现 第一步&#xff1a;当点击立即购买生成订单 第二步&#xff1a;根据订单id查询订单信息 第三步&#xff1a;生成微信支付的二维码 第四步&#xff1a;查询订单支付状态 前端实现 ​编辑 1.点击支付 2.订单详情页 接口实现 像这种微服务B2C模式的&#…

【牛客刷题】每日一练——最小K个数

✨hello&#xff0c;进来的小伙伴们&#xff0c;你们好耶&#xff01;✨ &#x1f345;&#x1f345;系列专栏:【牛客刷题】 ✈️✈️本篇内容: 最小K个数&#xff01; ⛵⛵作者简介&#xff1a;一名双非本科大三在读的科班Java编程小白&#xff0c;道阻且长&#xff0c;你我同…

《漂浮城堡历险记》的云端之旅

《漂浮城堡历险记》是 The Sandbox 游戏制作基金支持的项目之一。让我们告诉你更多关于这个 The Sandbox 元宇宙独有的、令人上瘾的奇幻游戏的信息吧。它已在 The Sandbox Alpha 第 3 季中上线了&#xff01; 关于体验 在《漂浮城堡历险记》这个冒险战斗游戏中&#xff0c;玩家…

基于深度学习的机载激光扫描森林单株茎的检测、分割与模型拟合

Abstract 精确测量树木的结构特征&#xff0c;如高度、直径、宽度和锥度&#xff0c;是森林资源调查的重要组成部分。目前&#xff0c;地面和空中激光雷达都被用来产生点云数据&#xff0c;通过这些数据可以确定清单指标。陆地/地面扫描通常提供每平方米数千个点的点云分辨率&…

(附源码)计算机毕业设计ssm核酸结果查询系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【 java 多线程】同步锁 (Lock) 解决线程的安全问题

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…

计算机网络课程设计——中小型网络工程设计

文件地址:https://github.com/Recursiondzl/Computer-Network 摘 要&#xff1a;本次计算机网络实践&#xff0c;完成了中小型网络工程设计与实现对计算机网络知识进行了系统的复习&#xff0c;实践能力获得了巨大的提升。 中小型网络工程设计与实现中&#xff0c;使用路由器…

DDD初步简单理解

概述 最近有一个项目要使用DDD模式来写&#xff0c;大致整理一下笔记。 问题&#xff1a;为什么要使用DDD&#xff1f;大概要怎么使用DDD&#xff1f; 目录 概述 MVC和DDD比较 实例介绍 简洁代码逻辑示例 总结 MVC和DDD比较 MVC&#xff08;module&#xff0c;view&#xff0c…

最适合跑步用的耳机有哪些、精选五款最优秀的跑步耳机推荐

越来越多的人选择在运动的时候佩戴蓝牙耳机&#xff0c;身为健身教练&#xff0c;也有很多人会让我们推荐蓝牙耳机&#xff0c;那么现在到底市面上哪些机型是最适合跑步的时候用的呢&#xff1f;我趁着最近有空搜集了一些资料跟我使用过的经验&#xff0c;给大家整理了一份最值…

揭秘EVM Opcodes

1. 引言 本文主要源自Macro团队的Gilbert在ETHNewYork 2022分享 Demystifying EVM Opcodes&#xff0c;同时结合evm.codes来理解。 学习EVM Opcodes&#xff0c;可成为更好的Solidity工程师。 更好的Solidity工程师&#xff0c;意味着&#xff1a; 1&#xff09;理解Solidity…

【新手向】Rock5B官方Debian系统设置中文环境(简单设置)和远程桌面连接

一、环境与说明 Rock5B的系统&#xff1a;官方Debian11&#xff08;2022-10-01版本&#xff09; 前面的两篇文章都是在2022-09-19版本镜像中操作的&#xff0c;2022-10-01版本内置了中文字体&#xff0c;不要自己下载了。目前Rock5B的硬件版本是v1.42&#xff0c;大概在23年初…

一致性哈希原理

一致性哈希原理 分布式系统将数据分布到不同的节点来存储&#xff0c;比如一个分布式KV&#xff08;key-value&#xff09;缓存系统&#xff0c;某个key应该到哪个节点上获得&#xff0c;最直观的方法是使用哈希算法&#xff08;hash(key)%n&#xff09;&#xff0c;对key进行…

python--绘制WRF模式近地面风场以及辐射

使用python自动化绘制WRF模式输出的风场以及辐射 本脚本主要用来自动化处理WRF模式数据&#xff0c;可以根据自己指定的时间范围以及时间步长绘制相应的数据 1 导入库 import cmaps import numpy as np import glob from netCDF4 import Dataset import matplotlib.pyplot a…

【C++】从零开始的CS:GO逆向分析3——写出一个透视

【C++】从零开始的CS:GO逆向分析3——写出一个透视本篇内容包括:1. 透视实现的方法介绍2. 通过进程名获取进程id和进程句柄3. 通过进程id获取进程中的模块信息(模块大小,模块地址,模块句柄)4. 读取游戏内存(人物ViewMatrix,敌人坐标,敌人生命值,敌人阵营)5. 三维坐标…