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

CUDA学习笔记5——CUDA程序错误检测

CUDA程序错误检测

所有CUDA的API函数都有一个类型为cudaError_t的返回值,代表了一种错误信息;只有返回cudaSuccess时,才是成功调用。

  • cudaGetLastError()用来检测核函数的执行是否出错
  • cudaGetErrorString()输出错误信息
#include <stdio.h>
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include<math.h>
#include <malloc.h> 
#include <opencv2/opencv.hpp>
#include <stdlib.h>#define BLOCK_SIZE 1//图像卷积 GPU
__global__ void sobel_gpu(unsigned char* in, unsigned char* out, const int Height, const int Width)
{int x = blockDim.x * blockIdx.x + threadIdx.x;int y = blockDim.y + blockIdx.y + threadIdx.y;int index = y * Width + x;int Gx = 0;int Gy = 0;unsigned char x0, x1, x2, x3, x4, x5, x6, x7, x8;if (x>0 && x<(Width-1) && y>0 && y<(Height-1)){x0 = in[(y - 1)*Width + (x - 1)];x1 = in[(y - 1)*Width + (x)];x2 = in[(y - 1)*Width + (x + 1)];x3 = in[(y)*Width + (x - 1)];x5 = in[(y)*Width + (x + 1)];x6 = in[(y + 1)*Width + (x - 1)];x7 = in[(y + 1)*Width + (x)];x8 = in[(y + 1)*Width + (x + 1)];Gx = (x0 + 2 * x3 + x6) - (x2 + 2 * x5 + x8);Gy = (x0 + 2 * x1 + x2) - (x6 + 2 * x7 + x8);out[index] = (abs(Gx) + abs(Gy)) / 2;}
}int main()
{cv::Mat src;src = cv::imread("complete004.jpg");cv::Mat grayImg,gaussImg;cv::cvtColor(src, grayImg, cv::COLOR_BGR2GRAY);cv::GaussianBlur(grayImg, gaussImg, cv::Size(3,3), 0, 0, cv::BORDER_DEFAULT);int height = src.rows;int width = src.cols;//输出图像cv::Mat dst_gpu(height, width, CV_8UC1, cv::Scalar(0));//GPU存储空间int memsize = height * width * sizeof(unsigned char);//输入 输出unsigned char* in_gpu;unsigned char* out_gpu;cudaMalloc((void**)&in_gpu, memsize);cudaMalloc((void**)&out_gpu, memsize);cudaError_t error_code;dim3 threadsPreBlock(BLOCK_SIZE, BLOCK_SIZE);dim3 blocksPreGrid((width + threadsPreBlock.x - 1)/threadsPreBlock.x, (height + threadsPreBlock.y - 1)/threadsPreBlock.y);cudaMemcpy(in_gpu, gaussImg.data, memsize, cudaMemcpyHostToDevice);sobel_gpu <<<blocksPreGrid, threadsPreBlock>>> (in_gpu, out_gpu, height, width);error_code = cudaGetLastError();printf("Error: %s\n", cudaGetErrorString(error_code));printf("FILE: %s\n", __FILE__);printf("LINE: %d\n", __LINE__);printf("Error code: %d\n", error_code);cudaMemcpy(dst_gpu.data, out_gpu, memsize, cudaMemcpyDeviceToHost);cv::imwrite("dst_gpu_save.png", dst_gpu);//cv::namedWindow("src", cv::WINDOW_NORMAL);cv::imshow("src", src);cv::imshow("dst_gpu", dst_gpu);cv::waitKey();cudaFree(in_gpu);cudaFree(out_gpu);return 0;
}

在这里插入图片描述在这里插入图片描述

樊哲勇大牛的检测CUDA运行时错误的宏函数:

#pragma once
#include<stdio.h>#define CHECK(call)																\
do                                                                              \
{																				\const cudaError_t error_code = call;										\if (error_code != cudaSuccess)												\{																			\printf("CUDA Error:\n");												\printf("	File:	%s\n", __FILE__);									\printf("	Line:	%d\n",__LINE__);									\printf("	Error code: %d\n",error_code);								\printf("	Error text: %s\n", cudaGetErrorString(error_code));			\exit(1);																\}																			\
} while (0)																		

采用检测CUDA运行时错误的宏函数:

#include <stdio.h>
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include<math.h>
#include <malloc.h> 
#include <opencv2/opencv.hpp>
#include <stdlib.h>#include "error.cuh"#define BLOCK_SIZE 1//图像卷积 GPU
__global__ void sobel_gpu(unsigned char* in, unsigned char* out, const int Height, const int Width)
{int x = blockDim.x * blockIdx.x + threadIdx.x;int y = blockDim.y + blockIdx.y + threadIdx.y;int index = y * Width + x;int Gx = 0;int Gy = 0;unsigned char x0, x1, x2, x3, x4, x5, x6, x7, x8;if (x>0 && x<(Width-1) && y>0 && y<(Height-1)){x0 = in[(y - 1)*Width + (x - 1)];x1 = in[(y - 1)*Width + (x)];x2 = in[(y - 1)*Width + (x + 1)];x3 = in[(y)*Width + (x - 1)];x5 = in[(y)*Width + (x + 1)];x6 = in[(y + 1)*Width + (x - 1)];x7 = in[(y + 1)*Width + (x)];x8 = in[(y + 1)*Width + (x + 1)];Gx = (x0 + 2 * x3 + x6) - (x2 + 2 * x5 + x8);Gy = (x0 + 2 * x1 + x2) - (x6 + 2 * x7 + x8);out[index] = (abs(Gx) + abs(Gy)) / 2;}
}int main()
{cv::Mat src;src = cv::imread("complete004.jpg");cv::Mat grayImg,gaussImg;cv::cvtColor(src, grayImg, cv::COLOR_BGR2GRAY);cv::GaussianBlur(grayImg, gaussImg, cv::Size(3,3), 0, 0, cv::BORDER_DEFAULT);int height = src.rows;int width = src.cols;//输出图像cv::Mat dst_gpu(height, width, CV_8UC1, cv::Scalar(0));//GPU存储空间int memsize = height * width * sizeof(unsigned char);//输入 输出unsigned char* in_gpu;unsigned char* out_gpu;cudaMalloc((void**)&in_gpu, memsize);cudaMalloc((void**)&out_gpu, memsize);dim3 threadsPreBlock(BLOCK_SIZE, BLOCK_SIZE);dim3 blocksPreGrid((width + threadsPreBlock.x - 1)/threadsPreBlock.x, (height + threadsPreBlock.y - 1)/threadsPreBlock.y);cudaMemcpy(in_gpu, gaussImg.data, memsize, cudaMemcpyHostToDevice);sobel_gpu <<<blocksPreGrid, threadsPreBlock>>> (in_gpu, out_gpu, height, width);CHECK(cudaMemcpy(dst_gpu.data, out_gpu, memsize*10, cudaMemcpyDeviceToHost));//增大size值  引起报错cv::imwrite("dst_gpu_save.png", dst_gpu);//cv::namedWindow("src", cv::WINDOW_NORMAL);cv::imshow("src", src);cv::imshow("dst_gpu", dst_gpu);cv::waitKey();cudaFree(in_gpu);cudaFree(out_gpu);return 0;
}

在这里插入图片描述

相关文章:

CUDA学习笔记5——CUDA程序错误检测

CUDA程序错误检测 所有CUDA的API函数都有一个类型为cudaError_t的返回值&#xff0c;代表了一种错误信息&#xff1b;只有返回cudaSuccess时&#xff0c;才是成功调用。 cudaGetLastError()用来检测核函数的执行是否出错cudaGetErrorString()输出错误信息 #include <stdi…...

虹科 | 解决方案 | 机械免拆压力测试方案

对于发动机的气门卡滞或气门开闭时刻错误、活塞环磨损、喷油嘴泄漏/堵塞等故障&#xff0c;往往需要解体发动机或拆卸部件才能发现&#xff1b;而对于某些轻微的故障&#xff0c;即使解体了发动机后也经常难于肉眼判别 虹科Pico提供的WPS500压力测试方案&#xff0c;可以动态测…...

Python数据挖掘实用案例——自动售货机销售数据分析与应用

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;陈童学哦&#xff0c;目前学习C/C、算法、Python、Java等方向&#xff0c;一个正在慢慢前行的普通人。 &#x1f3c0;系列专栏&#xff1a;陈童学的日记 &#x1f4a1;其他专栏&#xff1a;CSTL&…...

深度学习技巧应用29-软件设计模式与神经网络巧妙结合,如何快速记忆软件设计模式

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下软件设计模式与神经网络巧妙结合&#xff0c;如何快速记忆软件设计模式。我们知道软件设计模式有23种&#xff0c;考试的时候经常会考到&#xff0c;但是这么种里面我们如何取判断它呢&#xff0c;如何去记忆它呢&a…...

中文编程开发语言工具应用案例:ps5体验馆计时收费管理系统软件

中文编程开发语言工具应用案例&#xff1a;ps5体验馆计时收费管理系统软件 软件部分功能&#xff1a; 1、计时计费功能&#xff1a;只需点开始计时即可&#xff0c;时间直观显示 2、商品管理功能&#xff1a;可以管理饮料等商品 3、会员管理功能&#xff1a;支持只用手机号作…...

绘制核密度估计图

简介 核密度估计图&#xff08;Kernel Density Estimation&#xff0c;KDE&#xff09;是一种用于估计数据分布的非参数方法&#xff0c;通常用于可视化和理解数据的分布情况。它通过平滑地估计数据的概率密度函数&#xff08;PDF&#xff09;来显示数据的分布特征&#xff0c…...

基于深度学习网络的蔬菜水果种类识别算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1数据集准备 4.2构建深度学习模型 4.3模型训练 4.4模型评估 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 clc; clear; close all; wa…...

UE4 距离场

在项目设置的渲染模块可打开距离场 把该节点连上&#xff0c;该节点的意思是&#xff0c;距离表面越近&#xff0c;材质显示值为0 不接近表面时&#xff1a; 接近表面时 可勾选该值即可看到距离场具体效果&#xff1a; 未接触表面时&#xff1a; 接触表面时&#xff1a; 产生…...

【SA8295P 源码分析 (四)】26 - QNX Ethernet MAC 驱动 之 emac_rx_thread_handler 数据接收线程 源码分析

【SA8295P 源码分析】26 - QNX Ethernet MAC 驱动 之 emac_rx_thread_handler 数据接收线程 源码分析 一、emac_rx_thread_handler():通过POLL 轮询方式获取数据二、emac_rx_poll_mq():调用 pdata->clean_rx() 来处理消息三、emac_configure_rx_fun_ptr():配置 pdata->…...

VR全景广告:让消费者体验沉浸式交互,让营销更有趣

好的产品都是需要广告宣传的&#xff0c;随着科技的不断发展&#xff0c;市面上的广告也和多年前的传统广告不同&#xff0c;通过VR技术&#xff0c;可以让广告的观赏性以及科技感更加强烈&#xff0c;并且相比于视频广告&#xff0c;成本也更低。 在广告营销中&#xff0c;关键…...

论文阅读 | RAFT: Recurrent All-Pairs Field Transforms for Optical Flow

RAFT: Recurrent All-Pairs Field Transforms for Optical Flow ECCV2020光流任务best paper 论文地址&#xff1a;【here】 代码地址&#xff1a;【here】 介绍 光流是对两张相邻图像中的逐像素运动的一种估计。目前碰到的一些困难包括&#xff1a;物体的快速运动&#xff…...

神经网络的发展历史

神经网络的发展历史可以追溯到上世纪的数学理论和生物学研究。以下是神经网络发展史的详细概述&#xff1a; 早期的神经元模型&#xff1a; 1943年&#xff0c;Warren McCulloch和Walter Pitts提出了一种神经元模型&#xff0c;被称为MCP神经元模型&#xff0c;它模拟了生物神经…...

【单元测试】--单元测试最佳实践

一、单元测试代码风格 编写单元测试代码时&#xff0c;遵循一致的风格和最佳实践是非常重要的&#xff0c;因为它有助于提高代码的可读性、可维护性和可靠性。以下是一些常见的单元测试代码风格和最佳实践&#xff1a; 命名约定&#xff1a; 测试方法的名称应当清晰、描述性&…...

llava1.5-部署

llava1.5 ——demo部署 下载代码和权重 新建weights文件夹&#xff0c;并下载到LLaVA/weights/中。->需要修改文件名为llava-版本&#xff0c;例如llava-v1.5-7b. 运行 启动控制台 python -m llava.serve.controller --host 0.0.0.0 --port 4006启动gradio python -m…...

倒计时 1 天|KCD 2023 杭州站

距离「KCD 2023 杭州站」开始只有 1 天啦 大家快点预约到现场哦&#xff5e; KCD 2023 活动介绍 HANGZHOU 关于 KCD Kubernetes Community Days&#xff08;KCD&#xff09;由云原生计算基金会&#xff08;CNCF&#xff09;发起&#xff0c;由全球各国当地的 CNCF 大使、CNCF 员…...

什么是模拟芯片,模拟芯片都有哪些测试指标?

模拟芯片又称处理模拟信号的集成电路 模拟集成电路主要是指由电容、电阻、晶体管等组成的模拟电路集成在一起用来处理模拟信号的集成电路。有许多的模拟集成电路&#xff0c;如运算放大器、模拟乘法器、锁相环、电源管理芯片等。 模拟集成电路的主要构成电路有&#xff1a;放…...

C++-json(2)-unsigned char-unsigned char*-memcpy-strcpy-sizeof-strlen

1.类型转换&#xff1a; //1.赋值一个不知道长度的字符串unsigned char s[] "kobe8llJfFwFSPiy"; //1.用一个字符串初始化变量 unsigned int s_length strlen((char*)s); //2.获取字符串长度//2.字符串里有双引号"" 需要…...

python安装第三方包

1 命令行下载 pip install 包名称 进入命令行输入该命令 由于pip是连接的国外的网站进行包的下载&#xff0c;所以有的时候会速度很慢。 我们可以通过如下命令&#xff0c;让其连接国内的网站进行包的安装&#xff1a; pip install -i https://pypi.tuna.tsinghua.edu.cn/s…...

《数据结构、算法与应用C++语言描述》-队列的应用-电路布线问题

《数据结构、算法与应用C语言描述》-队列的应用-电路布线问题 问题描述 在 迷宫老鼠问题中&#xff0c;可以寻找从迷宫入口到迷宫出口的一条最短路径。这种在网格中寻找最短路径的算法有许多应用。例如&#xff0c;在电路布线问题的求解中&#xff0c;一个常用的方法就是在布…...

GC overhead limit exceeded问题

1.问题现象 程序包运行时候发生了java.lang.OutOfMemoryError: GC overhead limit exceeded异常&#xff0c; 详细信息如下 org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: org.jboss.util.NestedSQLException: Error; - nested t…...

别急着买群晖!用你吃灰的旧笔记本,30分钟搞定Windows家庭文件共享中心

闲置笔记本变身家庭数据中枢&#xff1a;零成本搭建Windows共享系统的完整指南 在智能设备普及的今天&#xff0c;每个家庭都面临着数据存储与共享的难题——手机照片无处安放、电影资源无法多设备共享、重要文档需要反复传输。当市面上的NAS设备动辄数千元时&#xff0c;很多人…...

PyTorch单层神经网络实战:从原理到实现

1. 单层神经网络基础概念解析在深度学习领域&#xff0c;单层神经网络&#xff08;Single Layer Neural Network&#xff09;是最基础的模型架构之一。虽然现在深度学习模型动辄几十甚至上百层&#xff0c;但理解单层神经网络的工作原理对于掌握更复杂的模型至关重要。单层神经…...

React Router懒加载终极指南:如何大幅提升应用首屏性能

React Router懒加载终极指南&#xff1a;如何大幅提升应用首屏性能 【免费下载链接】react-router Declarative routing for React 项目地址: https://gitcode.com/GitHub_Trending/re/react-router React Router是React生态中最流行的声明式路由库&#xff0c;通过懒加…...

Model Context Protocol:机器学习模型全生命周期管理的关键协议

1. 项目概述在机器学习模型开发领域&#xff0c;Model Context Protocol&#xff08;模型上下文协议&#xff09;正逐渐成为连接模型训练、部署与监控的关键桥梁。这个协议本质上是一套标准化的数据结构和通信规范&#xff0c;它允许开发者在模型生命周期的各个阶段传递和保留关…...

硬件安全模糊测试与泄漏合约的创新融合

1. 硬件安全模糊测试与泄漏合约的融合创新在处理器安全研究领域&#xff0c;一个长期存在的矛盾是&#xff1a;现代高性能处理器通过复杂的微架构优化&#xff08;如乱序执行、推测执行&#xff09;来提升性能&#xff0c;但这些优化往往成为信息泄漏的源头。2018年曝光的Spect…...

别再死记硬背了!用三极管思维,1分钟搞懂MOS管的Rdson到底在哪个区

三极管思维解锁MOS管&#xff1a;Rdson工作区的类比学习法 每次看到MOS管数据手册上那个毫欧级的Rdson参数&#xff0c;你是不是也好奇过——这个"导通电阻"到底对应着MOS管的哪个工作状态&#xff1f;是可变电阻区还是饱和区&#xff1f;今天我们就用工程师更熟悉的…...

避坑指南:ArcGIS中河网上下游分析,为什么你的流向总是不对?

ArcGIS河网流向分析全攻略&#xff1a;从原理到实战避坑指南 从事水利规划或流域分析的朋友们&#xff0c;一定遇到过这样的困扰——明明按照标准流程操作&#xff0c;ArcGIS中的河网流向却总是不按预期显示。下游分析结果莫名其妙&#xff0c;追踪路径半路中断&#xff0c;反复…...

别只盯着LeetCode了!想进Google,你的GitHub仓库里还缺这几样东西

别只盯着LeetCode了&#xff01;想进Google&#xff0c;你的GitHub仓库里还缺这几样东西 在技术面试的竞技场上&#xff0c;LeetCode刷题早已成为标配动作。但当所有候选人都能熟练解决动态规划和图论问题时&#xff0c;面试官的注意力自然会转向那些能真正体现工程素养的细节—…...

从模型仓库到MLOps流水线:我是如何用ModelScope Library搭建个人AI工作台的

从模型仓库到MLOps流水线&#xff1a;我是如何用ModelScope Library搭建个人AI工作台的 第一次接触ModelScope时&#xff0c;我正为一个图像生成项目的模型管理问题头疼不已。团队里每个人都在用不同版本的Stable Diffusion&#xff0c;微调参数和数据集散落在各自的笔记本上&a…...

如何在Home Assistant中实现美的智能家电的本地网络控制:3步完成终极本地化方案

如何在Home Assistant中实现美的智能家电的本地网络控制&#xff1a;3步完成终极本地化方案 【免费下载链接】homeassistant-midea-air-appliances-lan This Home Assistant custom component adding support for controlling Midea air conditioners and dehumidifiers on loc…...