深度学习部署笔记(八): CUDA RunTime API-2.1Hello CUDA

news2024/9/22 7:22:17

在这里插入图片描述

1. CUDA Driver API和CUDA Runtime API

CUDA Driver API和CUDA Runtime API都是用于访问GPU的API。它们之间的区别在于它们的功能和使用方法不同。

CUDA Driver API是一个底层的API,它提供了对GPU硬件的底层访问,以及GPU硬件的直接控制。使用Driver API需要编写更多的底层代码,例如手动管理GPU内存分配、执行GPU kernel等。它对于需要更细粒度控制GPU的应用程序非常有用。

而CUDA Runtime API则是一个更高层次的API,它提供了对GPU硬件的更简单的访问和控制。CUDA Runtime API隐藏了大部分底层细节,例如内存管理、调度和线程同步等。这使得开发人员可以更容易地开发出GPU加速的应用程序。

总之,CUDA Driver API是一个更底层的API,提供了更大的灵活性和控制力,但需要编写更多的底层代码。而CUDA Runtime API则提供了更高层次的抽象,使得开发人员更容易地编写GPU加速的应用程序,但是在一些场景下可能会有一些性能瓶颈。开发人员需要根据具体的需求来选择使用哪种API。

2. 两种API的区别

  1. 对于runtimeAPI,与driver最大区别是懒加载
  2. 即,第一个runtime API调用时,会进行cuInit初始化,避免驱动api的初始化窘境
  3. 即,第一个需要context的API调用时,会进行context关联并创建context和设置当前context,调用cuDevicePrimaryCtxRetain实现
  4. 绝大部分api需要context,例如查询当前显卡名称、参数、内存分配、释放等
  5. CUDA Runtime是封装了CUDA Driver的高级别更友好的API
  6. 使用cuDevicePrimaryCtxRetain为每个设备设置context,不再手工管理context,并且不提供直接管理context的API(可Driver API管理,通常不需要)
  7. 可以更友好的执行核函数,.cpp可以与.cu文件无缝对接
  8. 对应cuda_runtime.h和libcudart.so
  9. runtime api随cuda toolkit发布
  10. 主要知识点是核函数的使用、线程束布局、内存模型、流的使用
  11. 主要实现归约求和、仿射变换、矩阵乘法、模型后处理,就可以解决绝大部分问题

3. 第一个CUDA RunTime API 程序Hello CUDA


// CUDA运行时头文件
#include <cuda_runtime.h>

// CUDA驱动头文件
#include <cuda.h>
#include <stdio.h>
#include <string.h>

#define checkRuntime(op)  __check_cuda_runtime((op), #op, __FILE__, __LINE__)

bool __check_cuda_runtime(cudaError_t code, const char* op, const char* file, int line){
    if(code != cudaSuccess){    
        const char* err_name = cudaGetErrorName(code);    
        const char* err_message = cudaGetErrorString(code);  
        printf("runtime error %s:%d  %s failed. \n  code = %s, message = %s\n", file, line, op, err_name, err_message);   
        return false;
    }
    return true;
}

int main(){

    CUcontext context = nullptr;
    cuCtxGetCurrent(&context);
    printf("Current context = %p,当前无context\n", context);

    // cuda runtime是以cuda为基准开发的运行时库
    // cuda runtime所使用的CUcontext是基于cuDevicePrimaryCtxRetain函数获取的
    // 即,cuDevicePrimaryCtxRetain会为每个设备关联一个context,通过cuDevicePrimaryCtxRetain函数可以获取到
    // 而context初始化的时机是懒加载模式,即当你调用一个runtime api时,会触发创建动作
    // 也因此,避免了cu驱动级别的init和destroy操作。使得api的调用更加容易
    int device_count = 0;
    checkRuntime(cudaGetDeviceCount(&device_count));
    printf("device_count = %d\n", device_count);

    // 取而代之,是使用setdevice来控制当前上下文,当你要使用不同设备时
    // 使用不同的device id
    // 注意,context是线程内作用的,其他线程不相关的, 一个线程一个context stack
    int device_id = 0;
    printf("set current device to : %d,这个API依赖CUcontext,触发创建并设置\n", device_id);
    checkRuntime(cudaSetDevice(device_id));

    // 注意,是由于set device函数是“第一个执行的需要context的函数”,所以他会执行cuDevicePrimaryCtxRetain
    // 并设置当前context,这一切都是默认执行的。注意:cudaGetDeviceCount是一个不需要context的函数
    // 你可以认为绝大部分runtime api都是需要context的,所以第一个执行的cuda runtime函数,会创建context并设置上下文
    cuCtxGetCurrent(&context);
    printf("SetDevice after, Current context = %p,获取当前context\n", context);

    int current_device = 0;
    checkRuntime(cudaGetDevice(&current_device));
    printf("current_device = %d\n", current_device);
    return 0;
}

4. 分解这个案例

#define checkRuntime(op) __check_cuda_runtime((op), #op, __FILE__, __LINE__)

bool __check_cuda_runtime(cudaError_t code, const char* op, const char* file, int line)
{
    if (code != cudaSuccess)   // if (code !=0)
    {
        const char* err_name = cudaGetErrorName(code);
        const char *err_message = cudaGetErrorString(code);
        printf("runtime error %s:%d %s failed. \n", file, line, op);
        printf("错误code: %s\n", err_name);
        printf("错误message: \n",err_message);
        return false;
    }
    return true;
}

这里跟之前没有区别,唯一改变的就是CUresult改成了cudaError_t 这个一样,也是枚举类,0是成功的

// 查看device数量
int device_count = 0;
cudaGetDeviceCount(&device_count);
printf("当前一共有%d台设备\n", device_count);

cuCtxGetCurrent(&context);
printf("SetDevice after, Current context = %p, 获取当前context\n", context);

CUDA RunTime API是不需要手动管理context, context在CUDA编程中很重要的,管理了CUDA操作的状态信息,表示CUDA操作在哪个设备上执行,包括分配的内存,执行的CUDA线程。

Driver API会需要使用cuCtxCreate函数创建和set来管理,而RuntimeAPI不需要

cuda runtime所使用的CUcontext是基于cuDevicePrimaryCtxRetain函数获取的
即,cuDevicePrimaryCtxRetain会为每个设备关联一个context,通过cuDevicePrimaryCtxRetain函数可以获取到

因为是懒加载模式,所以调用API的时候自动创建,所以这里也不用cuInit,也不用destory释放内存,使得API调用更加简洁

注意,是由于set device函数是“第一个执行的需要context的函数”,所以他会执行cuDevicePrimaryCtxRetain并设置当前context,这一切都是默认执行的。注意:cudaGetDeviceCount是一个不需要context的函数

你可以认为绝大部分runtime api都是需要context的,所以第一个执行的cuda runtime函数,会创建context并设置上下文

这个案例里的context依然是在Driver API,只不过为了演示拿出来而已

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

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

相关文章

聊天机器人分析,它值不值得做?

如今&#xff0c;聊天机器人热度持续走高。在您的网站或社交媒体上设置它们比以往任何时候都容易。然而&#xff0c;相当多的公司也犯了同样的错误。他们非常热衷于尝试聊天机器人&#xff0c;但随后是时候提出一些重要问题了。我们的聊天机器人工作了吗&#xff1f;他们表现如…

Flutter面试题解析-GridView详解与应用

一、前言Flutter 作为时下最流行的技术之一&#xff0c;凭借其出色的性能以及抹平多端的差异优势&#xff0c;早已引起大批技术爱好者的关注&#xff0c;甚至一些 闲鱼 &#xff0c; 美团 &#xff0c; 腾讯 等大公司均已投入生产使用。虽然目前其生态还没有完全成熟&#xff0…

CAD如何绘制A0/A1/A2/A3/A4图框?

在CAD制图时&#xff0c;设计师一般会使用企业的定制图框模板或者个人的特色图框模板&#xff0c;让设计方案更加标准化、规范化。对于新人设计师而言&#xff0c;完成CAD制图已经非常头疼了&#xff0c;图框的绘制更是手忙脚乱。那么是否有更加高效的方式来完成A0、A1、A2、A3…

Windows中UWP、WPF和Windows窗体的区别

Windows 中开发应用&#xff08;或者可以说客户端&#xff09;有三种方法&#xff1a; UWP&#xff08;Universal Windows Platform&#xff09;、WPF&#xff08;Windows Presentation Foundation&#xff09;和 Windows 窗体&#xff08;Win Forms&#xff09;。这三种方法在…

【word】插入代码排版

迟早会转战latex highlight不好用 highlight网站 http://codeinword.com/ 类似这样的网站还有很多。主要问题就是&#xff0c;复制的代码带有不容易编辑的行号以及前面绿色的标识 而且放到word里也不容易调整。还有word会自动默认格式&#xff0c;不方便加小图名之类的问题 …

【2023年的就业形势依旧严峻】

2023年口罩放开的第一年&#xff0c;也是第一个招聘会&#xff0c;挤满了求职者和用人单位&#xff0c;大多数都是想着重新开始&#xff0c;抓住金三银四的好时机&#xff0c;找到心仪的工作和符合岗位要求的人才&#xff0c;一起整装出发。我们理想的状态是&#xff0c;经济已…

【本地网站上线】ubuntu搭建web站点,并内网穿透发布公网访问

【本地网站上线】ubuntu搭建web站点&#xff0c;并内网穿透发布公网访问前言1. 本地环境服务搭建2. 局域网测试访问3. 内网穿透3.1 ubuntu本地安装cpolar3.2 创建隧道3.3 测试公网访问4. 配置固定二级子域名4.1 保留一个二级子域名4.2 配置二级子域名4.3 测试访问公网固定二级子…

Python 分支结构

Python 分支结构 应用场景 迄今为止&#xff0c;我们写的Python代码都是一条一条语句顺序执行&#xff0c;这种代码结构通常称之为顺序结构。然而仅有顺序结构并不能解决所有的问题&#xff0c;比如我们设计一个游戏&#xff0c;游戏第一关的通关条件是玩家获得1000分&#x…

【项目实战】SpringBoot整合Protobuf,实现基于RestTemplate的模拟客户端与服务端的远程调用

一、背景说明 项目中使用到了Protobuf&#xff0c;但是因为不知道怎么使用它&#xff0c;所以看起来很高大上&#xff0c;现在写一个简单的Demo来实现基于RestTemplate的模拟客户端与服务端的远程调用&#xff01; 二、实操代码 2.1 定义依赖POM文件 <dependencies>&…

花菁染料IR:IR808 Maleimide,IR 808 Mal,IR-808马来酰亚胺具有光稳定性好

【中文名称】IR-808马来酰亚胺【英文名称】 IR-808 Maleimide&#xff0c;IR-808 Mal【IR-808结 构 式】【CAS号】N/A【基团部分】IR-808【纯度标准】95%【包装规格】10mg&#xff0c;25mg&#xff0c;50mg&#xff0c;可以提供核磁图谱及相关质量证明图谱【是否接受定制】是【…

自动组策略(GPO)备份工具

Active Directory&#xff08;AD&#xff09;中的组策略对象&#xff08;GPO&#xff09;在控制用户和计算机账户的工作环境中起着至关重要的作用。单个GPO可以包含数百或数千个设置。它还可以链接到OU或域&#xff0c;从而控制位于其中的用户或计算机。当这样一个功能强大的AD…

C++:异常

在学习异常之前&#xff0c;来简单总结一下传统的处理错误的方式&#xff1a; 1. 终止程序&#xff0c;如assert&#xff0c;缺陷&#xff1a;用户难以接受。如发生内存错误&#xff0c;除0错误时就会终止程序。 2. 返回错误码&#xff0c;缺陷&#xff1a;需要程序员自己去查找…

利用蜜罐捕捉攻击实验(31)

预备知识 1、蜜罐的含义和作用 蜜罐(Honeypot)是一种在互联网上运行的计算机系统。它是专门为吸引并诱骗那些试图非法闯入他人计算机系统的人(如电脑黑客)而设计的&#xff0c;蜜罐系统是一个包含漏洞的诱骗系统&#xff0c;它通过模拟一个或多个易受攻击的主机&#xff…

数据分析:基于K-近邻(KNN)对Pima人糖尿病预测分析

数据分析&#xff1a;基于K-近邻(KNN)对Pima人糖尿病预测分析 作者&#xff1a;AOAIYI 作者简介&#xff1a;Python领域新星作者、多项比赛获奖者&#xff1a;AOAIYI首页 &#x1f60a;&#x1f60a;&#x1f60a;如果觉得文章不错或能帮助到你学习&#xff0c;可以点赞&#x…

小型双轮差速底盘三灰度循迹功能的实现

1. 功能说明 在小型双轮差速底盘样机前方安装3个 灰度传感器 &#xff0c;实现机器人沿下图所指定的跑道路线进行运动的效果。 2. 使用样机 本实验使用的样机为R023样机。 3. 功能实现 3.1 电子硬件 在这个示例中&#xff0c;我们采用了以下硬件&#xff0c;请大家参考&#…

likeshop社区团购v1.5.1更新

likeshop社区团购系统适用于初创业或者个人创业者&#xff0c;希望以低成本、高效益的方式开展本地电商业务&#xff0c;或者已经拥有线下实体店或实体店经验的商家&#xff0c;希望将线上业务扩展到社区团购平台&#xff0c;提升线上业务的营收。 likeshop社区团购V1.5.1版本…

第十五章 opengl之高级OpenGL(模板测试)

OpenGL模板测试模板函数物体轮廓模板测试 当片段着色器处理完一个片段后&#xff0c;模板测试就会开始执行。类似于深度测试&#xff0c;模板测试也可能会丢弃片段。被保留的片段会进入深度测试&#xff0c;可能会丢弃更多的片段。 模板测试是根据模板缓冲来进行的。一个模板缓…

什么是ChatGPT?

目录前言一、什么是GPT&#xff1f;二、什么是ChatGPT&#xff1f;三、ChatGPT应用场景四、ChatGPT未来展望五、OpenAI介绍前言 3月3号&#xff0c;早上6:30就有人发消息给我&#xff0c;来问我有关GPT API的事件。 那是因为3月2号&#xff0c;OpenAI 发布了ChatGPT 3.5的开放…

提高办公效率的免费网站有哪些

收藏一些免费好用的网站&#xff0c;在我们工作中需要用到的时候可以直接使用&#xff0c;提高我们的工作效率。小编就和大家分享10个可以提高我们办公效率的免费网站。 1.羽兔网软件下载-以设计类软件为主的免费软件下载网站 很多小白都不知道怎么下载软件&#xff0c;往往搜…

【Python】AES加解密代码,文章还有加密串等你来解密,等你来挑战

&#x1f366;&#x1f366;写这篇AES文章也是有件趣事&#xff0c;有位小伙伴发了段密文&#xff0c;看看谁解密速度快&#xff0c;学过Python的小伙伴一下子就解开来了&#xff0c;内容也挺有趣的。 &#x1f35f;&#x1f35f;原来加解密也可以这么有趣&#xff0c;虽然看起…