第五天 CUDA Runtime API

这篇具有很好参考价值的文章主要介绍了第五天 CUDA Runtime API。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

第五天 CUDA Runtime API

  • 图中可以看到,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;
}

参考文献文章来源地址https://www.toymoban.com/news/detail-416346.html

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

到了这里,关于第五天 CUDA Runtime API的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【leetcode:1944. 队列中可以看到的人数】单调栈算法及其相关问题

    1944. 队列中可以看到的人数 有  n  个人排成一个队列, 从左到右  编号为  0  到  n - 1  。给你以一个整数数组  heights  ,每个整数  互不相同 , heights[i]  表示第  i  个人的高度。 一个人能  看到  他右边另一个人的条件是这两人之间的所有人都比他们两人  矮  。更

    2024年01月25日
    浏览(13)
  • 详解‘CUDA driver version is insufficient for CUDA runtime version

    目录 详解 \\\'CUDA driver version is insufficient for CUDA runtime version\\\' 背景 解决方法 步骤1:查看CUDA运行时要求的驱动程序版本 步骤2:检查当前CUDA驱动程序版本 步骤3:更新CUDA驱动程序 步骤4:验证更新结果 步骤5:重新运行CUDA应用程序 结论 当你在使用CUDA运行时时,有时可能会遇到

    2024年02月21日
    浏览(9)
  • 为什么深度优先搜索可以判定简单图中是否有环,而宽度优先搜索不行?

    为什么深度优先搜索可以判定简单图中是否有环,而宽度优先搜索不行?

    1,首先可以肯定的是,对于无向图而言,宽搜和深搜都能判断是否有环。 简要说明一下,假如一个无向图有环,那么在宽搜的过程中,能搜到已经访问过的结点。如果一个无向图没有环(参考无向树),那么它的宽度优先搜索过程中,是不会访问到已访问过的结点的。 对于

    2024年02月14日
    浏览(20)
  • 安装库报错:No CUDA runtime is found, using CUDA_HOME=‘/usr/local/cuda-11.3‘

    安装库时报错: 查看cuda版本和pytorch版本 因此发现是由于该虚拟环境中CUDA与torch的版本不对应,发现在安装虚拟环境的environment.yml文件中只有指定cuda版本,而没有自动安装正确的torch版本: 重新安装torch,在 torch 官网中找到适配的版本,并安装 pip install torch 1.12.1+cu113 torch

    2024年02月12日
    浏览(12)
  • 【深度学习】RTX2060 2080如何安装CUDA,如何使用onnx runtime

    【深度学习】RTX2060 2080如何安装CUDA,如何使用onnx runtime

    RTX 2060虽然是一款较早的显卡型号,但仍然广泛使用。对于Python开发者来说,配置CUDA 10是非常关键的,尤其是在深度学习和GPU加速计算任务中。本文将为你提供一个详细的配置指南。 首先,确保你已经安装了最新版本的NVIDIA显卡驱动。你可以通过访问NVIDIA官方网站来下载和安

    2024年01月17日
    浏览(17)
  • 代碼隨想錄算法訓練營|第五十五天|1143.最长公共子序列、1035.不相交的线、53. 最大子序和。刷题心得(c++)

    目录 讀題 1143.最长公共子序列 自己看到题目的第一想法 看完代码随想录之后的想法 1035.不相交的线 自己看到题目的第一想法 53. 最大子序和 看完代码随想录之后的想法 1143.最长公共子序列 - 實作 思路 Code 1035.不相交的线 - 實作 思路 Code 53. 最大子序和 - 實作 思路 Code 總結

    2024年02月06日
    浏览(14)
  • 荣耀、华为手机usb调试已打开,且电脑上也可以看到此设备,但adb devices不显示设备

    荣耀、华为手机usb调试已打开,且电脑上也可以看到此设备,但adb devices不显示设备

    终端打开开发者模式,用数据线连接电脑,然后按照下面的步骤操作 adb已安装   1、开启开发者选项: 设置-关于手机-版本号(连续点击5次) 2、打开USB调试 在开发者选项中,找到USB调试,将此打开。 3、cmd进入命令行  4、查看设备 adb devices 注:荣耀、华为手机一直无法显

    2024年02月04日
    浏览(42)
  • 第六十五天 API安全-接口安全&WebPack&REST&SOAP&WSDL&WebService

    第六十五天 API安全-接口安全&WebPack&REST&SOAP&WSDL&WebService

    1.HTTP类接口-测评 2.RPC类接口-测评 3.Web Service类-测评 参考链接:https://www.jianshu.com/p/e48db27d7c70 内容点: SOAP(Simple Object Access Protocol)简单对象访问协议是交换数据的一种协议规范, 是一种轻量的、简单的、基于XML(标准通用标记语言下的一个子集)的协议,它被设计 成在WEB上

    2024年02月22日
    浏览(14)
  • windows下CUDA的卸载,怒推!!!亲测可以!!!

    windows下CUDA的卸载,怒推!!!亲测可以!!!

    我在配置VS和CUDA的过程中,出现了差错,因此不得不卸载CUDA,下面是卸载CUDA的教程,亲测有效。 教程 1.windows自带的控制面板,用来卸载主程序windows自带的控制面板,用来卸载主程序 。 在控制面版中打开程序和功能。 卸载CUDA的一些相关程序软件。   保留上图上的三个程

    2024年02月11日
    浏览(7)
  • ArcGIS Runtime API for Android--如何从Geometry中获取闭合区域面积?

    使用草图编辑器可以很方便的在底图上进行点线面的绘制,但是绘制完的图形,如何获取值呢?我查了很多资料都没说到关键点,可能默认大家都会,但是我比较菜,还是需要详细说明的。通过官方文档最终实现了面积数据的提取(文档终于看明白了)。 目录  效果 1.Geome

    2024年02月15日
    浏览(12)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包