问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何进行CUDA C程序核函数的调试

发布网友 发布时间:2022-04-23 21:01

我来回答

1个回答

热心网友 时间:2022-04-28 06:07

由于CUDA调试工具的不完善、CUDA调试工具上手难度较高,并行思想本身就难调试等因素,CUDA调试一直都是一件很蛋疼的事情。写CUDA也有三四年了,前段时间在群里见别人问CUDA调试的问题,突然有想法写个CUDA调试的博客。自己经验尚浅,希望各位大大看过后能够在评论里指点一二,共同完善这篇博客。
本博客只针对逻辑bug。

1  定位bug

出现bug的第一想法自然是定位bug。cuda比较奇特的地方在于,有时报错bug在500行,但500行出的代码没有错误,而是在1000行的地方逻辑错了,十分头疼。
下面介绍三种我总结的定位bug方法:

1.1  二分法

一半一半的注释代码,定位bug。比较笨拙和麻烦,但是十分好用。

1.2  输出定位法

将整体代码分为几个模块,正常的CUDA代码大概可以分为数据初始化,内存申请,内存拷贝,核函数执行,结果拷贝等模块。在每个模块结束后输出标志,示例如图1。这样在调试时就可以根据输出快速定位bug大约在什么位置。如下图:

1.3  调试工具

对于部分bug,可以用调试工具更快速的定位。
在linux下,对于访存越界等问题,cuda gdb可以直接定位在崩溃那一行。
win下是Nsight,我不熟悉nsight,求大神补充。

2  解决bug

比较简单的bug,定位后基本就一眼就解决了。但对于复杂的bug,还是比较费劲的。

2.1  调试工具

单步调试,打断点。无论是cuda gdb还是Nsight,都可以定位到某一个线程上进行调试,可以说是非常强大。cuda gdb和nsight都有英文官方文档,建议大家都学一学,熟练后调试事半功倍。
但因为大量线程随机并行执行,有时并不知道该定位到哪个线程上;线程调试不容易控制;定位到单线程调试比较费劲,费时间;教程少(虽然有官方文档),上手难度较大一些。这些都是CUDA调试工具没有被广泛接受的原因。

2.2  缩小数据量或线程数并在核函数中打印

大量线程并行是导致CUDA调试难度大的最大原因,尽量的减少并行量是一个非常好的降低调试难度的办法。“小并行”甚至“串行”能够大大方便调试。

在Fermi以后的架构中,可以在核函数中使用printf。
在合理范围内缩小数据量,进而减少线程数,比如输入图像大小改为16*16。或者修改线程为<<<1,1>>>,printf打印,看是否与预期结果相同。

3  预防bug

每一个写CUDAer大概都有花几个小时甚至几天调一个bug的经历。既然bug这么难调,那么预防bug就显得尤其重要了。

3.1  写代码前一定要完全构思好架构

社会快速发展,人的心也变得着急了。写CUDA代码之前,一定要沉得住气,多花点时间在纸上构思代码,将代码模块化,哪里容易出问题,哪里该写输出,哪里该检查。

3.2  函数返回结果检查

函数返回结果检查能够非常好的定位bug,是基本的编程意识。
虽然代码可能看起来会比较冗余,示例如下,也可以参考cuda sample里的代码。

3.3  函数输入检查

在调用比较重要的函数时,建议用assert检查输入参数与预期值是否相同。

3.4  核函数内检查

举个例子,遇到的情况是在拷贝shred memory时,拷贝逻辑比较复杂。此时可以写一个检查函数,以保证拷贝的正确性。
核函数内代码如下:

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
玉米仁子饭产自哪里 中国期货交易所的交易品种有哪些? 历史要怎么读,有啥诀窍 高中历史诀窍 年终会活动策划方案 深度解析:第一财经回放,探索财经新风向 逆水寒手游庄园怎么邀请好友同住 逆水寒手游 逆水寒不同区可以一起组队吗? 逆水寒手游 逆水寒怎么进入好友世界? 逆水寒手游 逆水寒怎么去别人的庄园? CUDA是什么?主要应用在什么地方? 怎样能学好初中历史? 文明礼仪我先行的演讲稿 文明礼貌我先行的内容 初一学习历史的方法 文明礼仪从我做起的内容 文明礼仪活动目的 文明礼仪我先行怎么样做 关于文明礼仪我先行的社会实践行 “文明礼仪我传递”的实践活动怎么做? 文明礼仪我先行计划怎么写,? 求活动名为“讲文明懂礼仪,从我做起”,活动面向全体市民展开的详细可行的活动方案 文明礼仪伴我行内容是什么? 新买的海尔冰箱一直嗡嗡响,处于工作状态状态,不会停怎么回事? vivo恢复系统默认通话应用在哪里找 1957年中秋节公历是几月几日? 2012年的中秋节是阳历几月几号 梦见逛风暴雨是怎么回事 1996年中秋节阳历应该是几月几日 你能不能帮我查一下2001年的中秋节是几月几日(要新历) 显卡设置里的CUDA是什么? 如何理解cuda c线程组织和线程协作 cuda c可以用双精度吗 什么是CUDA? 把字,复印成书本,怎么搞 您好,我也是最近刚学CUDA,想请教一下入门经验,可否指教一下?GPU高性能运算之CUDA也看不太懂,郁闷中。 我目前能编一些比较基础的C语言程序,那个cuda是不是和C有比较大的关系,我有一些C甚至C++的基 像这图是怎么打印到书本上的?叫什么方法? NVIDIA显卡支持CUDA,什么是CUDA NVIDIA显卡的的CUDA核心是什么? 安装CUDA6.5发现找不到C:&#92;ProgramData&#92;NVIDIA Corporation&#92;NVIDIA GPU Computing这个文件夹,请问在哪? 如何在书本的封面或扉页复印或打印上所需文字或图片? 怎样用word将一堆文字搞成可以拿去印刷厂打印书本的文件。下面有页码。 windows怎么查看cuda是否安装成功? CUDA能取代CPU吗? 想把自己随笔写的文字故事弄成一本纸质书本,该怎么弄?只是自己收藏的,不想去找什么印刷公司,求解 java可以调用cuda程序吗 怎么在书的扉页上加印文字?书是成品书,有人说可以用丝网印刷,不知道这样操作简单吗,成本高吗? 怎么把书上的字印到本子上去? 有没有那种可以帮我把自己的文字印成书,但只是几本的机构或地方?