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

CUDA系列之常用Runtime API简介

文章目录

  • 1. 前言
  • 2. Device 管理
  • 3. Error Handling
  • 4. 内存管理
  • 5. Stream 管理
  • 6. Event 管理
  • 7. 执行控制
  • 8. 多卡管理
  • 9. 实践用例

1. 前言

在读这篇文章前,大家环境应该已经ready,如果环境未安装,可以看上一篇文章。CUDA runtime api是利用频率最高的API,熟练掌握这些API的用法,会让我们的程序变得非常的灵活。
详细的API介绍,可以参考官网文档

2. Device 管理

API描述
cudaChooseDevice通过输入的properties匹配一个最合适的device
cudaDeviceGetAttribute获取指定device的执行熟悉的值
cudaDeviceGetP2PAttribute获取srcDevice 到 dstDevice的P2P属性
cudaGetDeviceCount获取当前device数量
cudaGetDevice获取当前的device id
cudaGetDeviceProperties获取指定device 的属性
cudaSetDevice设置当前device的device id,常用于多卡时,卡间的切换
cudaDeviceResetreset当前device的所有状态
cudaDeviceSynchronize等待device 计算完成

3. Error Handling

这块api,主要时一些error的获取与处理

API描述
cudaGetLastError获取上一个runtime api的error code,并清除error handle
cudaGetErrorName通过error code,获取error code的名字
cudaGetErrorString通过error code, 获取error的错误信息
cudaPeekAtLastError获取上一个runtime api的error code,但不清除error handle

4. 内存管理

API描述
cudaMalloc在当前卡上分配一块device内存,类似cpu的malloc
cudaFree释放cudaMalloc申请的内存,类似cpu的free
cudaMallocHost分配一块page-locked的cpu内存,该内存可以在kernel中直接访问
cudaFreeHost释放cudaMallocHost分配的内存
cudaMallocManaged分配一块托管内存,自动识别是放在cpu还是device
cudaMemcpy内存搬运,支持D2D, H2D,D2H,H2H
cudaMemcpyAsync异步内存搬运,支持D2D, H2D,D2H,H2H
cudaMemset初始化device 内存,类似cpu的memset
cudaMemsetAsync异步初始化device 内存

5. Stream 管理

API描述
cudaStreamAddCallback将一个callback挂载在流上
cudaStreamCreate流的创建
cudaStreamCreateWithFlags通过flag创建流
cudaStreamCreateWithPriority创建带优先级的流
cudaStreamDestroy流的销毁
cudaStreamGetFlags获取流的flag
cudaStreamGetPriority获取流的优先级
cudaStreamQuery获取流的完成状态
cudaStreamSynchronize等待流的所有任务完成
cudaStreamWaitEvent流等待事件的发生

6. Event 管理

event 常与stream 一起使用,来做流之间的通过,同时也可以通过event来获取device侧的运行事件

API描述
cudaEventCreate事件创建
cudaEventCreateWithFlags创建指定属性的事件
cudaEventDestroy事件的销毁
cudaEventElapsedTime获取start到end的耗时
cudaEventQuery获取事件的状态
cudaEventRecord在流上插入一个事件
cudaEventSynchronize等待一个事件的完成

7. 执行控制

API描述
cudaFuncGetAttributes获取kernel函数的属性
cudaFuncSetSharedMemConfig设置device函数的shared memory配置
cudaLaunchKernel启动核函数,简单的kernel推荐使用<<<>>>来启动

8. 多卡管理

API描述
cudaDeviceCanAccessPeer获取两卡之间的连接状态
cudaDeviceDisablePeerAccess禁用两卡之间的连接
cudaDeviceEnablePeerAccess使能两卡之间的连接

9. 实践用例

#include <cuda_runtime.h>__global__ void vectorAdd(int* out, int* in1, int* in2, size_t size){int idx = blockIdx.x * blockDim.x + threadIdx.x;if (idx < size) {out[idx] = in1[idx] + in2[idx];}
}int main() {int *dout, *din1, *din2;int *hout, *hin1, *hin2;constexpr size_t size= 10240;// 分配device内存cudaMalloc(&dout, size * sizeof(int));cudaMalloc(&din1, size * sizeof(int));cudaMalloc(&din2, size * sizeof(int));// 分配host内存cudaMallocHost(&hout, size * sizeof(int));cudaMallocHost(&hin1, size * sizeof(int));cudaMallocHost(&hin2, size * sizeof(int));// 内存初始化for (size_t i = 0; i < size; i++) {hin1[i] = rand();hin2[i] = rand();}// 将初始化数据从host搬运到devicecudaMemcpy(din1, hin1, size * sizeof(int), cudaMemcpyHostToDevice);cudaMemcpy(din2, hin2, size * sizeof(int), cudaMemcpyHostToDevice);// 启动核函数dim3 block(1024);dim3 grid((size + block.x - 1) / block.x);vectorAdd<<<grid, block>>>(dout, din1, din2, size);cudaDeviceSynchronize();// 将kernel运行数据从device回传到hostcudaMemcpy(hout, dout, size * sizeof(int), cudaMemcpyDeviceToHost);bool is_pass = true;for (size_t i = 0; i < size; i++) {is_pass &= hout[i] == (hin1[i] + hin2[i]);}// 内存回收cudaFree(dout);cudaFree(din1);cudaFree(din2);cudaFreeHost(hout);cudaFreeHost(hin1);cudaFreeHost(hin2);return is_pass? EXIT_SUCCESS : EXIT_FAILURE;
}

编译:

/usr/local/cuda/bin/nvcc -I/usr/local/cuda/include -O3 -DNDEBUG  --generate-code=arch=compute_90,code=[compute_90,sm_90] -std=c++17 vector_add.cu -o vector_add
http://www.dtcms.com/a/307547.html

相关文章:

  • BatchNorm 一般放在哪里?
  • Ⅹ—6.计算机二级综合题19---22套
  • 接口自动化测试以及requests
  • TS语法最佳实践
  • 【笔记】热力学定律推导(6)热力学第二定律推导
  • 【MATLAB】(二)基础知识
  • Golang 指针
  • Valgrind终极指南:深入内存安全与性能瓶颈检测
  • 云原生运维与混合云运维:如何选择及 Wisdom SSH 的应用
  • Android依赖注入框架Hilt入门指南
  • 大白话畅谈:stm32中断和FreeRTOS的中断
  • 【源力觉醒 创作者计划】_巅峰对话文心 4.5 与通义千问、DeepSeek 能力对比解析
  • 【工具】NVM完全指南:Node.js版本管理工具的安装与使用详解
  • 如何将照片从 realme 手机传输到电脑?
  • MongoDB系列教程-第四章:MongoDB Compass可视化和管理MongoDB数据库
  • node.js之Koa框架
  • 蓝牙 BR/EDR 与 BLE PHY
  • Kafka在Springboot项目中的实践
  • vue3.0 + TypeScript 中使用 axios 同时进行二次封装
  • ESXI虚拟交换机 + H3C S5120交换机 + GR5200路由器组网笔记
  • 数据结构与算法:队列的表示和操作的实现
  • Linux 下自动化脚本安装Jdk、Nginx等软件
  • Java语言/Netty框架的新能源汽车充电桩系统平台
  • 《人工智能导论》(python版)第2章 python基础2.2编程基础
  • Rust视频处理开源项目精选
  • FFmpegHandler 功能解析,C语言程序化设计与C++面向对象设计的核心差异
  • 【日常问题解决方案】VS2022不小心解决方案资源管理器把关掉了怎么办
  • spring cloud alibaba ——gateway网关
  • Day36| 1049. 最后一块石头的重量 II、494.目标和、474.一和零
  • 图论-最短路Dijkstra算法