第五天 CUDA Runtime API

news2024/9/29 5:28:50

在这里插入图片描述

  • 图中可以看到,Runtime API 是基于 Driver API 之上开发的一套 API
  • Driver API 基本都是 cu 开头的,而Runtime API 基本都是以 cuda 开头的

Runtime API 概述

  1. CUDA Runtime是封装了CUDA Driver的高级别更友好的API
  2. cudaruntime需要引入cudart这个so文件
  3. 上下文管理:
    • 3.1. 使用cuDevicePrimaryCtxRetain为每个设备设置context,不再手工管理context,并且不提供直接管理context的API
    • 3.2. 任何依赖CUcontext的API被调用时,会触发CUcontext的创建和对设备的绑定
      • 此后任何API调用时,会以设备id为基准,调取绑定好的CUcontext
      • 因此被称为懒加载模式,避免了手动维护CUcontext的麻烦
  4. cuda的状态返回值,都是cudaError_t类型,通过check宏捕获状态并处理是一种通用方式
    • 官方案例采用宏,而非这里的函数加宏
    • 函数加宏具有更加好的便利性

Runtime API 的特点

Runtime API 与 Driver API 最大的区别是懒加载 ,即在真正执行功能时才自动完成对应的动作,即:

第一个 Runtime API 调用时,会自动进行 cuInit 初始化,避免 Driver API 未初始化的错误;

第一个需要 context 的 API 调用时,会创建 context 并进行 context 关联,和设置当前 context,调用 cuDevicePrimaryCtxRetain 实现;

绝大部分 api 都需要 context,例如查询当前显卡名称、参数、内存分配释放等

CUDA Runtime 是封装了 CUDA Driver 的更高级别、更友好的 API

Runtime API 使用 cuDevicePrimaryCtxRetain 为每个设备设置 context,不再手动管理 context,并且不提供直接管理 context 的 API(可 Driver API 管理,通常不需要)

可以更友好地执行核函数,.cpp 可以与 .cu 文件无缝对接

Runtime API 对应 cuda_runtime.h 和 libcudart.so

Runtime API 随 cudatoolkit 发布

主要知识点是核函数的使用、线程束布局、内存模型、流的使用

主要是为了实现归约求和、放射变换、矩阵乘法、模型后处理,就可以解决绝大部分问题


代码示例


// 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;
}

参考文献

  1. https://developer.nvidia.com/cuda-toolkit-archive
  2. https://docs.nvidia.com/cuda/archive/11.2.0/

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

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

相关文章

系统分析师案例题【系统设计篇(Web开发)】

目录 1、Web综合知识考察 2、单台机器到数据库与Web服务器分离 3、应用服务器集群 3.1 负载均衡 3.2 Session 共享机制 3.3 有状态和无状态 4、持久化技术 5、数据库读写分离化 6、缓存技术 7、Redis 7.1 Redis集群切片与分片 7.2 Redis分布式存储 7.3 Redis数据类…

Windows使用ngrok实现本地程序外网域名访问-详细教程

需求分析 同事要求在外网以域名的方式&#xff0c;访问我本地的程序&#xff0c;故需要将localhost:8080映射到外网&#xff0c;让同事可以通过&#xff1a;域名/接口 的形式访问到本地程序的功能接口 安装 进入官网&#xff1a;https://ngrok.com/ 点击顶部Download&#x…

十三、市场活动:全部导出

功能需求&#xff1a;批量导出市场活动 用户在市场活动主页面,点击"批量导出"按钮,把所有市场活动生成一个excel文件,弹出文件下载的对话框; 用户选择要保存的目录,完成导出市场活动的功能. *导出成功之后,页面不刷新 功能分析&#xff1a;导出市场活动 1.给批量…

打卡Android学习—Compose 布局 和 修饰符

我们将通过解释 布局 和 修饰符 的基础知识 来开始我们的旅程。我们将介绍他们是如何协同工作的&#xff0c;Compose 提供了什么开箱即用的API&#xff0c;以及如何漂亮地设计您的UI 布局——因为 Compose 中的几乎所有内容都是布局 布局是Compose UI的核心组件&#xff0c;使…

( “树” 之 BST) 669. 修剪二叉搜索树 ——【Leetcode每日一题】

二叉查找树&#xff08;BST&#xff09;&#xff1a;根节点大于等于左子树所有节点&#xff0c;小于等于右子树所有节点。 二叉查找树中序遍历有序。 669. 修剪二叉搜索树 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树&…

机器学习——核函数

问&#xff1a;已知三维空间中的两个样本点分别为&#xff08;2&#xff0c;4&#xff0c;5)和(1&#xff0c;2&#xff0c;3)&#xff0c;定义核函数表达式为:试计算这两个样本点映射到十维空间后的 答&#xff1a;首先计算两个样本点的平方内积2*14*25*325 然后代入核函数表…

互联网医院软件|互联网医院系统开发|在线问诊提高医疗效率

互联网医院系统源码开发设计理念是以患者为中心&#xff0c;将医院的各个科室、医生资源进行有效的整合和调配。互联网医院系统开发是基于最新的Web技术和云计算技术所构建的一种全新的医疗信息化平台&#xff0c;可以通过网页、小程序等多种方式&#xff0c;为患者提供在线预约…

Logstash:通过 lookups 来丰富数据

如果你想了解更多关于 lookup 的内容&#xff0c;请参阅文章 “Elastic&#xff1a;开发者上手指南” 中的 “丰富数据及 lookup” 章节。在今天的文章中&#xff0c;我来总结在 Logstash 中一些常用的 lookups。如下的这些插件可以帮助你使用附加信息丰富数据&#xff0c;例如…

基于深度学习的车型识别系统(Python+清新界面+数据集)

摘要&#xff1a;基于深度学习的车型识别系统用于识别不同类型的车辆&#xff0c;应用YOLO V5算法根据不同尺寸大小区分和检测车辆&#xff0c;并统计各类型数量以辅助智能交通管理。本文详细介绍车型识别系统&#xff0c;在介绍算法原理的同时&#xff0c;给出Python的实现代码…

浏览器强缓存与协商缓存

一、强缓存 强制缓存的思想是&#xff0c;在浏览器内置数据库中缓存每次请求中 “可以被缓存” &#xff08;受到一些关键字的管控&#xff09;的静态资源如 image, css, js 文件&#xff0c; 当第二次请求被缓存过的资源时候&#xff0c;会通过校验两个字段 Expires 和 Cache-…

AAAI 2023MOVEDepth:基于单目线索和速度指导的自监督多帧深度估计

文章目录 解决的问题实施细节总结 会议/期刊&#xff1a;2023 AAAI 论文题目&#xff1a;《Crafting Monocular Cues and Velocity Guidance for Self-Supervised Multi-Frame Depth Learning》 论文链接&#xff1a;[JeffWang987/MOVEDepth: AAAI 2023]Crafting Monocular Cue…

Flutter TextField 交互实例 —— 新手礼包

大家好&#xff0c;我是 17。 新手礼包一共 3 篇文章&#xff0c;每篇都是描述尽量详细&#xff0c;实例讲解&#xff0c;包会&#xff01; Flutter Row 实例 —— 新手礼包Flutter TextField UI 实例 —— 新手礼包Flutter TextField 交互实例 —— 新手礼包 本篇包含所有常…

Unity打包WebGL: 导入Vue

Unity打包WebGL: 导入Vue 1. 介绍 1.1 任务 记录将Unity项目打包成WebGL&#xff0c;并集成到Vue项目中的过程。 1.2 环境 Unity:2021.3Vue: 2 2. Unity项目 2.1 UI界面 2.2 添加插件 构建WebGL项目需要添加一个.jslib文件&#xff0c;用于Unity脚本函数与JavaScript函数…

【FocalNet】学习笔记

1. 介绍 “FocalNet是map-based还是token-based模型呢&#xff1f;” FocalNet是token-based模型&#xff0c;与常见的【基于 feature map 的CNN】不同&#xff1b; 2. 模型代码 2.1 环境配置 [DINO | FocalNet-DINO] 2.1.1 配置CUDA11.1 Summary Driver: Not Selected…

FreeRTOS 时间管理

文章目录 一、FreeRTOS 延时函数1. 函数 vTaskDelay()2. 函数 prvAddCurrentTaskToDelayedList()3. 函数 vTaskDelayUntil() 二、FreeRTOS 系统时钟节拍 一、FreeRTOS 延时函数 1. 函数 vTaskDelay() 在 FreeRTOS 中延时函数也有相对模式和绝对模式&#xff0c;不过在 FreeRT…

epoll进阶

epoll除了提供select/poll那种IO事件的电平触发&#xff08;Level Triggered&#xff09;外&#xff0c;还提供了边沿触发&#xff08;Edge Triggered&#xff09;&#xff0c;这就使得用户空间程序有可能缓存IO状态&#xff0c;减少epoll_wait/epoll_pwait的调用&#xff0c;提…

经典文献阅读之--Orbeez-SLAM(单目稠密点云建图)

0. 简介 对于现在的VSLAM而言&#xff0c;现在越来越多的工作开始聚焦于如何将深度学习结合到VSLAM当中&#xff0c;而最近的这个工作就给出了一个比较合适的方法。《Orbeez-SLAM: A Real-time Monocular Visual SLAM with ORB Features and NeRF-realized Mapping》这篇文章&…

如何将模块加载到linux内核

一 顺利的情况 假设存在一个文件叫mymq.c,下该文件相同目录下的makefile如下语句&#xff1a; obj-y mymq.o 然后编译&#xff1a;编译完成了以后&#xff0c;mymq.c文件中&#xff0c;有个函数叫mymq_open,搜索这个函数在不在System.map文件中&#xff0c;如果在&#xff…

大屏使用echart开发省市地图数据,并点击省获取市地图数据

1. 本文在基础上进行改进&#xff0c;后端使用若依后端 IofTV-Screen: &#x1f525;一个基于 vue、datav、Echart 框架的物联网可视化&#xff08;大屏展示&#xff09;模板&#xff0c;提供数据动态刷新渲染、屏幕适应、数据滚动配置&#xff0c;内部图表自由替换、Mixins注入…

CDN与网络安全

DDoS攻击的影响远不止眼前所见。这些攻击不仅会造成巨大的经济损失&#xff0c;还会对受害公司或组织的声誉和形象产生严重影响。研究表明&#xff0c;受害公司至少需要10个小时才能开始解决攻击&#xff0c;而解除还需要4.5个小时。甚至在检测到攻击之前平均数小时&#xff0c…