3.9.错误处理的理解以及错误的传播特性

news2024/11/15 4:18:07

目录

    • 前言
    • 1. thrust
    • 2. error
    • 总结

前言

杜老师推出的 tensorRT从零起步高性能部署 课程,之前有看过一遍,但是没有做笔记,很多东西也忘了。这次重新撸一遍,顺便记记笔记。

本次课程学习精简 CUDA 教程-错误处理的理解以及错误的传播特性

课程大纲可看下面的思维导图

在这里插入图片描述

1. thrust

thrust 是一个基于 CUDA 的高级并行编程库,提供了一组易于使用的算法和数据结构,用于在 GPU 上进行并行计算。(form chatGPT)

thrust 提供了类似于标准 C++ 模板库(STL)的接口和语法,使开发者能够以一种简单直观的方式利用 GPU 的并行计算能力。它提供了丰富的算法,如排序、归约、扫描、变换等,并支持向量、数组和键值对等多种数据结构。

需要注意的是,thrust 并不是 CUDA 的一部分,而是一个由 NVIDIA 提供的独立库。要使用 thrust,需要将其包含在项目中,并确保正确链接和配置相关的编译器和构建系统。

在后续高性能的开发中,thrust 用的还是较少,但是了解它的存在还是很重要的

thrust 案例的示例代码如下:


#include <stdio.h>
#include <thrust/host_vector.h>
#include <thrust/device_vector.h>
#include <thrust/sort.h>
#include <iostream>
using namespace std;

__host__ __device__
int sort_func(int a, int b){
    return a > b;
}

int main(){

    int data[] = {5, 3, 1, 5, 2, 0};
    int ndata  = sizeof(data) / sizeof(data[0]);
    thrust::host_vector<int> array1(data, data + ndata);
    thrust::sort(array1.begin(), array1.end(), sort_func);

    thrust::device_vector<int> array2 = thrust::host_vector<int>(data, data + ndata);
    thrust::sort(array2.begin(), array2.end(), []__device__(int a, int b){return a < b;});

    printf("array1------------------------\n");
    for(int i = 0; i < array1.size(); ++i)
        cout << array1[i] << endl;

    printf("array2------------------------\n");
    for(int i = 0; i < array2.size(); ++i)
        cout << array2[i] << endl;
    return 0;
}

运行效果如下:

在这里插入图片描述

图1-1 thrust案例运行效果

通过 thrust 库,可以轻松地对数据进行排序操作。在这个示例中,thrust::sort() 函数被用来对数据进行排序,用户可以根据自己的需求定义排序函数或使用匿名函数来指定排序规则。这样,开发者可以更加便捷地利用 GPU 的并行计算能力进行高效的数据排序。

关于 thrust 的知识点有:(from 杜老师)

  1. thrust 是 cuda 开发的,基于 cuda 的 stl 库,便于使用
  2. 因为通常没用到 thrust,所以对这块儿也不做过多解释
  3. 对于 thrust 中的 lambda 表达式,需要增加 __device__ 标记表明函数可以被核函数调用,此时需要在 Makefile 中增加 --extended-lambda 标记
  4. 由于使用到了 device vector,因此编译环境需要修改为 nvcc 编译,因此 main.cpp 改成了 main.cu
  5. 内存的复制和分配已经被 cuda 封装了

2. error

关于 cuda 中的错误处理,你需要了解:

  1. 错误处理是理解如何控制 cuda 发生的错误和捕获错误的技术
  2. 在写 cuda 相关代码时,错误检查是错误处理的一种手段
  3. 在这里着重拿出来讲可恢复和不可恢复的错误,以及其传播的特性

error 案例的示例代码如下:


#include <cuda_runtime.h>
#include <stdio.h>
#include <iostream>
using namespace std;

__global__ void func(float* ptr){

    int pos = blockIdx.x * blockDim.x + threadIdx.x;
    if(pos == 999){
        ptr[999] = 5;
    }
}

int main(){

    float* ptr = nullptr;

    // 因为核函数是异步的,因此不会立即检查到他是否存在异常
    func<<<100, 10>>>(ptr);
    //func<<<100, 1050>>>(ptr);
    auto code1 = cudaPeekAtLastError();
    cout << cudaGetErrorString(code1) << endl;

    // 对当前设备的核函数进行同步,等待执行完毕,可以发现过程是否存在异常
    auto code2 = cudaDeviceSynchronize();
    cout << cudaGetErrorString(code2) << endl;

    // 异常会一直存在,以至于后续的函数都会失败
    float* new_ptr = nullptr;
    auto code3 = cudaMalloc(&new_ptr, 100);
    cout << cudaGetErrorString(code3) << endl;
    return 0;
}

运行效果如下:

在这里插入图片描述

图2-1 error案例运行效果

在这个示例中,我们展示了如何处理 CUDA 中的错误。通过调用 cudaPeekAtLastError(),我们可以立即检查最近的 CUDA 错误,而调用 cudaDeviceSynchronize() 则会等待当前设备的核函数执行完毕并检查是否有错误发生。这样,我们可以在程序中适时地处理和报告错误,避免错误在后续的函数调用中传播导致进一步的问题。

关于 error 的知识点有:(from 杜老师)

  1. 若 cuda 核函数出错,由于他是异步的,立即执行 cudaPeekAtLastError 只会拿到对输入参数校验是否正确的状态,而不会拿到核函数是否执行正确的状态
  2. 所以我们最开始是没有捕获到任何异常的
  3. 也因此需要等待核函数执行完毕后,才真的知道当前核函数是否出错,一般通过设备同步或者流同步进行等待
  4. 错误可分为可恢复和不可恢复两种:
  • 可恢复
  • 参数配置错误等,例如 block 越界(一般最大值是1024),shared memory 大小超出范围(一般是48KB)
  • 通过 cudaGetLastError 可以获取错误代码,同时把当前状态恢复为 success
  • 该错误在调用核函数后可以立即通过 cudaGetLastError/cudaPeekAtLastError 拿到
  • 该错误在下一个函数调用的时候会覆盖
  • 不可恢复
  • 核函数执行错误,例如访问越界等等异常
  • 该错误则会传递到之后的所有 cuda 操作上
  • 错误状态通常需要等到核函数执行完毕才能够拿到,也就是有可能在后续的任何流程中突然异常(因为是异步的)

总结

本次课程学习了 thrust 和错误处理,thrust 提供了类似于标准 C++ STL 库的接口和语法,你需要知道有这么一个东西的存在。错误检查在写 cuda 代码时非常重要,对于 cuda 中的错误可分为可恢复和不可恢复两种,在 cuda 程序出现问题时我们需要知道如何处理。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机械臂与RealSense相机手眼标定

环境&#xff1a; 本文主要使用kinova mico机械臂 RealSense D435i深度相机进行了eye to hand的手眼标定。 系统环境&#xff1a;Ubuntu18.04&#xff0c;ROS Melodic 硬件&#xff1a;Kinova mico&#xff0c;RealSense D435i 特别注意&#xff1a;经测试&#xff0c;本方法…

大人,时代变了!做测试也要懂Python开发!(文末送书五本)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

一道有趣的C语言指针笔试题

一道有趣的指针笔试题 注&#xff1a;博主认为&#xff0c;如果想要做对并理解这一题的有关知识点&#xff0c;读者有必要对指针有一个较为全面且深刻的认识&#xff0c;如果小伙伴们对指针还不是太熟悉&#xff0c;建议先看看一篇带你玩转C语言指针&#xff1a;从入门到精通 …

OpenCV 入门教程:自适应阈值处理

OpenCV 入门教程&#xff1a;自适应阈值处理 导语一、自适应阈值处理二、示例应用2.1 图像二值化2.2 图像去噪 总结 导语 自适应阈值处理是图像处理中常用的技术之一&#xff0c;它能够根据图像的局部特征自动调整阈值&#xff0c;从而提高图像的处理效果。在 OpenCV 中&#…

手把手教你云相册项目简易开发 day1 Kafka+IDEA+Springboot+Redis+MySQL+libvips 简单运行和使用

项目的创建 项目采用的是微服务的架构。先创建一个父项目cloud-photo&#xff0c;然后再在module下创建api、image、users的子项目 相关配置&#xff1a; application.yml。此处如果没有redis的话可以先注释掉&#xff0c;因为后面启动需要mysql连接成功和redis服务启动 spr…

多元分类预测 | Matlab 麻雀算法(SSA)优化xgboost的分类预测,多特征输入模型,SSA-xgboost分类预测模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元分类预测 | Matlab 麻雀算法(SSA)优化xgboost的分类预测,多特征输入模型,SSA-xgboost分类预测模型 多特征输入单输出的二分类及多分类模型。程序

文心一言 VS 讯飞星火 VS chatgpt (56)-- 算法导论6.3 2题

文心一言 VS 讯飞星火 VS chatgpt &#xff08;56&#xff09;-- 算法导论6.3 2题 对于 BUILD-MAX-HEAP 中第 2行的循环控制变量 i 来说&#xff0c;为什么我们要求它是从A.length/2到1递减&#xff0c;而不是从1到A.length/2递增呢? 文心一言&#xff1a; 在 BUILD-MAX-HE…

MySQL每日一练:单表查询

一、首先需要创建一个名为worker的表&#xff1a; mysql> create table worker(-> part_id int(11) not null comment 部门号,-> work_id int(11) not null comment 职工号,-> work_time date not null comment 工作时间,-> salary float(8,2) not null commen…

提升工作效率:推荐几款实用的Mac项目管理工具!

在当今软件和技术高度发达的时代&#xff0c;项目管理依然是一项非常重要的任务。现在&#xff0c;有越来越多的人喜欢使用mac电脑进行项目管理&#xff0c;因为mac众所周知的稳定性和使用便捷性。但问题是&#xff0c;mac系统自带的项目管理工具并不是非常完美&#xff0c;因此…

自定义对象作为HashMap的键,同时重写hashCode和equals方法

如果要将自定义类的实例 作为HashMap的 键&#xff0c;必须重写hashCode和equals方法 简单版本&#xff0c;看不懂看后面复杂版本解释 复杂版本解释 当我们用 HashMap存入自定义的类时&#xff0c;如果不重写这个自定义类的equals和hashCode方法&#xff0c;得到的结果会和我们…

《现代操作系统(中文第四版)》第二章 进程与线程

第二章、进程与线程 操作系统最核心的概念就是进程&#xff0c;这是对正在运行程序的一个抽象。进程是操作系统提供的最古老的也是最重要的抽象概念之一&#xff0c;即使可以使用的cpu只有一个&#xff0c;他们也具有支持并发操作的能力&#xff0c;它们将一个单独的cpu变换成…

【azcopy】

azcopy 下载使用输出 下载 https://learn.microsoft.com/en-us/azure/storage/common/storage-use-azcopy-v10#download-azcopy使用 cd /Users/YJY/Downloads/azcopy_darwin_amd64_10.19.0./azcopy copy https://tapvqacaption.blob.core.windows.net/data/save /Users/YJY/D…

多元分类预测 | Matlab 灰狼算法(GWO)优化xgboost的分类预测模型,多特征输入模型,GWO-xgboost分类预测

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元分类预测 | Matlab 灰狼算法(GWO)优化xgboost的分类预测模型,多特征输入模型,GWO-xgboost分类预测 多特征输入单输出的二分类及多分类模型。程序内注释详细,直接替换数据就可以用。程序语言为matlab,程序可…

【分布式应用】zabbix:代理服务器、及监控其它应用

目录 一、部署 zabbix 代理服务器1.环境配置1.2设置 zabbix 的下载源&#xff0c;安装 zabbix-proxy1.3部署数据库1.4在 Web 页面配置 agent 代理1.5 配置 agent 使用 proxy 二、Zabbix 监控 Windows 系统三、zabbix监控java应用3.1、客户端开启 java jmxremote 远程监控功能3.…

C语言程序设计——数据在内存中的存储

一、数据类型介绍 1.基本内置类型 char // 字符数据类型 1 B short // 短整型 2 B int // 整型 4 B long // 长整型 4 or 8 B long long //更长的整型 8 B float //单精度浮点型 4 B double //双精…

自动化漏洞挖掘方式

自动化漏洞挖掘方式 一、Goby安装使用1.1、goby简介1.2、goby下载安装1.3、简单扫描1.4、Goby插件 二、Xray安装使用2.1、XRAY简介2.2、Xray安装2.3、Xray使用2.4、爬虫模式&#xff08;主动扫描&#xff09;2.5、被动扫描2.6、BurpSuite联动Xray2.7、Rad联动Xray 一、Goby安装…

X、Y、Z轴上旋转角度的Eigen::Vector3d对象转换为一个旋转矩阵

#include <iostream> #include <Eigen/Core> #include <Eigen/Geometry>using namespace std; using namespace Eigen;

django框架中使用ORM设计数据库的模型

ORM关联数据的逻辑是&#xff1a; Django 中常见的模型字段类型及其含义&#xff1a; AutoField&#xff1a;一个自动递增的整型字段&#xff0c;添加记录时它会自动增长。BigAutoField&#xff1a;一个自动递增的 biginteger字段&#xff0c;添加记录时它会自动增长。CharFie…

数据结构之图

7 图的存储 &#xff08;1&#xff09;图的邻接矩阵存储 对于无向图&#xff0c;邻接矩阵第i行/列上非零元素个数是顶点vi的度。 对于有向图&#xff0c;邻接矩阵第i行上非零元素个数是顶点vi的出度&#xff0c;第i列 上非零元素个数是顶点vi的入度。 对于带权有向图有边则…

常见面试题之垃圾收回

1. 简述Java垃圾回收机制&#xff1f;&#xff08;GC是什么&#xff1f;为什么要GC&#xff1f;&#xff09; 为了让程序员更专注于代码的实现&#xff0c;而不用过多的考虑内存释放的问题&#xff0c;所以&#xff0c;在Java语言中&#xff0c;有了自动的垃圾回收机制&#x…