cuda-gdb 调试 Program terminated with signal SIGKILL, Killed. The program no longer exists.
问题简介:
cuda-gdb 调试 Program terminated with signal SIGKILL, Killed. The program no longer exists.
问题背景:
编写cuda程序,需要核对计算过程是否正确,所以使用cuda-gdb来进行单步调试,并显示运算过程及结果。
通过 nvcc -g -G location.cu -o location
编译cuda程序
通过 cuda-gdb location
调试程序
键入 r
程序断在 如图示:
报出错误如下:
CUDA Exception: Warp Illegal Address
The exception was triggered at PC 0x5555c9de90 (location2.cu:45)
(cuda-gdb) n
[Thread 0x7fb7ff5010 (LWP 10479) exited]Program terminated with signal SIGKILL, Killed.
The program no longer exists.
问题分析:
在gdb调试时出现以上报错信息,通常是 内存相关问题,查看系统日志 tail /var/log/kern.log -n 1000
发现如下:
Aug 12 09:29:11 nx kernel: [ 1197.607814] nvgpu: 17000000.gv11b gv11b_fb_print_fault_info:710 [ERR] [MMU FAULT] mmu engine id: 65, ch id: 504, fault addr: 0x7ffff4e000, fault addr aperture: 0, fault type: invalid pde, access type: virt read,
Aug 12 09:29:11 nx kernel: [ 1197.608185] nvgpu: 17000000.gv11b gv11b_fb_print_fault_info:719 [ERR] [MMU FAULT] protected mode: 0, client type: gpc, client id: t1 2, gpc id if client type is gpc: 0,
Aug 12 09:29:12 nx kernel: [ 1199.027576] nvgpu: 17000000.gv11b gk20a_fifo_deferred_reset:1604 [ERR] chid: 503 is not bound to tsg
Aug 12 09:29:12 nx kernel: [ 1199.039202] nvgpu: 17000000.gv11b gk20a_tsg_unbind_channel:169 [ERR] Channel 504 unbind failed, tearing down TSG 4
第一段日志信息说是 [MMU FAULT] fault addr: 0x7ffff4e000
此时,我却任然一头雾水,在网上搜索了很多关于
“cuda-gdb 调试 Program terminated with signal SIGKILL, Killed.
The program no longer exists.”
这样的关键词,但所得结果均无效。搜索一下午,困惑一晚上,任然不得其解。第二天早上迷迷糊糊看向核函数的形参恍然大悟,问题不就是:将host变量引用传递给了device
在找到原因后才发现:其实,最重要的报错信息是如下,而我却忽略了
CUDA Exception: Warp Illegal Address
The exception was triggered at PC 0x5555c9de90 (location2.cu:45)
这报错信息明确说明 线程束非法地址,其异常被触发在 location2.cu 的45行处 。这意思不就是说地址非法了,再看源码
__global__
void gpu_location_kernel(DeviceArray2D<float>& struct_dev_arr_input_2D,DeviceArray2D<float>& struct_dev_arr_w1_2D, DeviceArray2D<float>& struct_dev_arr_w2_2D, DeviceArray2D<float>& struct_dev_arr_w3_2D,DeviceArray2D<float>& struct_dev_arr_b1_2D, DeviceArray2D<float>& struct_dev_arr_b2_2D, DeviceArray2D<float>& struct_dev_arr_b3_2D,DeviceArray2D<float>& struct_dev_median_layer1_reuslt, DeviceArray2D<float>& struct_dev_median_layer2_reuslt, DeviceArray2D<float>& struct_dev_final_reuslt)
{...
}
哈哈,我居然在核函数里使用引用,大错特错,再看源码调用 gpu_location_kernel
处,传递的参数居然是 host 变量的引用,大错特错。
想想为什么会犯这个错误呢?
其实我只是想通过结构体引用传递多个参数值,如果一个参数一个参数写作形参,实在是太长了。遂而将 device 地址放到了 host 结构体中,然后将 host 结构体的引用作为实参传递给核函数,这不出现非法地址,才怪!
解决办法:
只需要将 host 结构体 拷贝到 device 结构体中,然后将 device 结构体指针传递给核函数就可以了,这样既满足了传递多个参数而不追加形参,而又解决了目前的问题。
代码如下:
struct GPULocationKernelParameter{float *dev_arr_input_2D;size_t dev_arr_input_2D_pitch;int dev_arr_input_2D_rows;int dev_arr_input_2D_columns;float *dev_arr_w1_2D;size_t dev_arr_w1_2D_pitch;int dev_arr_w1_2D_rows;int dev_arr_w1_2D_columns;float *dev_arr_w2_2D;size_t dev_arr_w2_2D_pitch;int dev_arr_w2_2D_rows;int dev_arr_w2_2D_columns;float *dev_arr_w3_2D;size_t dev_arr_w3_2D_pitch;int dev_arr_w3_2D_rows;int dev_arr_w3_2D_columns;float *dev_arr_b1_2D;size_t dev_arr_b1_2D_pitch;int dev_arr_b1_2D_rows;int dev_arr_b1_2D_columns;float *dev_arr_b2_2D;size_t dev_arr_b2_2D_pitch;int dev_arr_b2_2D_rows;int dev_arr_b2_2D_columns;float *dev_arr_b3_2D;size_t dev_arr_b3_2D_pitch;int dev_arr_b3_2D_rows;int dev_arr_b3_2D_columns;float *dev_median_layer1_reuslt;size_t dev_median_layer1_reuslt_pitch;int dev_median_layer1_reuslt_rows;int dev_median_layer1_reuslt_columns;float *dev_median_layer2_reuslt;size_t dev_median_layer2_reuslt_pitch;int dev_median_layer2_reuslt_rows;int dev_median_layer2_reuslt_columns;float *dev_final_reuslt;size_t dev_final_reuslt_pitch;int dev_final_reuslt_rows;int dev_final_reuslt_columns;
};__global__
void gpu_location_kernel(GPULocationKernelParameter *dev_kernelParameter)
{GPULocationKernelParameter dev_struct_kernelParameter = *dev_kernelParameter;...
}
补充:
1.参考的cuda-gdb调试文章
CUDA-GDB 使用
CUDA C编程(三十八)CUDA调试
GDB调试操作
GDB调试
2.感悟
这个问题我思考了一下午近5h,外加困扰一晚上。现在回想这个问题的原因在报出时就已经给出了,然而我却浑然不知。所以我还是应该认认真真地去看执行过程报出的错误,里面每一个单词,每一句话都有深意。
cuda-gdb 调试 Program terminated with signal SIGKILL, Killed. The program no longer exists.相关推荐
- Program terminated with signal 11, Segmentation fault.
今天写程序遇到一个问题:Program terminated with signal 11, Segmentation fault. gdb 调试现象如下: warning: no loadable ...
- Program terminated with signal SIGSEGV, Segmentation fault.
问题: 在程序运行时出现了:Segmentation fault (core dumped),分段故障(堆芯转储)也就是段错误. 我首先在一篇博客上面找到如何使用gdb调试: 1.首先使用ulimit ...
- Linux下,Apache及PHP项目报Core错误Program terminated with signal 7, Bus error
最近上线的一个项目,使用Apache 2.2.32及ThinkPHP3.23,每天访问量共有几万吧,但会出现几十次错误,表现就是Apache根目录下,会出现Core.XXXXX的文件,同时错误日志内会 ...
- 用 GDB 调试Linux程序及有用技巧
用 GDB 调试Linux程序及有用技巧(转) armlinux 2008-06-19 10:48 阅读91 评论0 字号: 大大 中中 小小 GNU的调试器称为gdb,该程序是一个交 ...
- linux gdb bt core,core文件与gdb调试
本文简单介绍core文件与gdb调试core文件的方法 概要: 1. core 文件 2. 配置core程序崩溃时产生文件 3. 可修改core文件名 4. 产生core文件的情形 5. gdb调试c ...
- gdb php-fpm,使用 gdb 调试 php-fpm 异常错误
相关资源下载GDB简介 GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.如果你是在 UNIX平台下做软件,你会发现GDB这个调试工具有比VC.BCB的图形化调试器更强大的功能. 问题 ...
- 用gdb调试core dump文件
gdb基本的使用方法在此就不说了. 载入core文件的命令行为: dgb exe core 例如 gdb ./testall ./core.2345 最重要的一个命令是where,这个就像windbg ...
- Linux调试——gdb调试器的简单使用调试coredump文件
文章目录 一.背景 二.gdb的指令与使用 1.gdb的基本指令. 2.gdb指令的简单使用 1.进入gdb模式 2.实例说明 三.调试coredump文件 前提:本质上是在调试程序崩溃之后的内存镜像 ...
- 解决gdb 调试 core 文件函数名显示为问号的问题
关于gdb调试core文件总是一堆问号的问题 问题描述:已经在编译选项中加入了-g,但是查看core文件时,还是一堆问号,使用的命令为:gdb -c core 解决方案:由于gdb -c core这样 ...
最新文章
- OpenCV java 图片处理,蒙太奇图片(13)
- macOS 10.12 Sierra 中文官网正式推出
- maya为什么不能导出fbx_Maya无法展 UV的解决办法
- MySQL读写分离事务策略实现
- python核心数据类型_Python核心数据类型——列表
- heap 的一些用法
- Python学习之路和隐藏特征
- 方法文件Matlab调用动态链接库
- Hbase的安装与测试
- 文件上传—DiskFileItemFactory核心类
- How to deploy Odoo 11 on Ubuntu 18.04
- git 设置全局代理_git 代理配置
- mac下的c语言程序开发,mac VS Code配置C语言开发环境(小白简单Clang版)
- 7-5 换硬币 (20 分)
- 李嘉诚:没有人愿意贫穷,但出路在哪(转自意林)
- 秒变“女装大佬”!Snapchat推出性别转换滤镜,离线实时渲染(附测评)
- matlab计算高斯分布函数,MATLAB如何使用normcdf函数计算正态分布的累积概率
- 【小技巧】argc和argv的用法
- URLEncoder与URLDecoder编码相互转换
- Treemily想做封闭版的家族社群,比Geni更迎合华人家庭观念