第六天 CUDA内存管理

news2025/2/28 21:34:07

操作内存分配和数据复制过程概述

  1. 在gpu上开辟一块空间,并把地址记录在mem_device上
  2. 在cpu上开辟一块空间,并把地址记录在mem_host上,并修改了该地址所指区域的第二个值
  3. 把mem_host所指区域的数据都复制到mem_device的所指区域
  4. 在cpu上开辟一块空间,并把地址记录在mem_page_locked上
  5. 最后把mem_device所指区域的数据又复制回cpu上的mem_page_locked区域

内存模型

  1. 内存分为

     - 主机内存:Host Memory,也就是CPU内存,内存
     
     - 设备内存:Device Memory,也就是GPU内存,显存
         - 设备内存又分为:
                 - 全局内存(3):Global Memory
                 - 寄存器内存(1):Register Memory
                 - 纹理内存(2):Texture Memory
                 - 共享内存(2):Shared Memory
                 - 常量内存(2):Constant Memory
                 - 本地内存(3):Local Memory
         
         - 只需要知道,谁距离计算芯片近,谁速度就越快,空间越小,价格越贵
         - 清单的括号数字表示到计算芯片的距离
    
  2. 通过cudaMalloc分配GPU内存,分配到setDevice指定的当前设备上

  3. 通过cudaMallocHost分配page locked memory,即pinned memory,页锁定内存

    • 页锁定内存是主机内存,CPU可以直接访问
    • 页锁定内存也可以被GPU直接访问,使用DMA(Direct Memory Access)技术
      • 注意这么做的性能会比较差,因为主机内存距离GPU太远,隔着PCIE等,不适合大量数据传输
    • 页锁定内存是物理内存,过度使用会导致系统性能低下(导致虚拟内存等一系列技术变慢)
  4. cudaMemcpy

    • 如果host不是页锁定内存,则:
      • Device To Host的过程,等价于
        • pinned = cudaMallocHost
        • copy Device to pinned
        • copy pinned to Host
        • free pinned
      • Host To Device的过程,等价于
        • pinned = cudaMallocHost
        • copy Host to pinned
        • copy pinned to Device
        • free pinned
    • 如果host是页锁定内存,则:
      • Device To Host的过程,等价于
        • copy Device to Host
      • Host To Device的过程,等价于
        • copy Host to Device
  • 建议先分配先释放
    checkRuntime(cudaFreeHost(memory_page_locked));
    delete [] memory_host;
    checkRuntime(cudaFree(memory_device)); 

使用cuda API来分配内存的一般都有自己对应的释放内存方法;而使用new来分配的使用delete来释放

在这里插入图片描述

// CUDA运行时头文件
#include <cuda_runtime.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(){

    int device_id = 0;
    checkRuntime(cudaSetDevice(device_id));

    float* memory_device = nullptr;
    checkRuntime(cudaMalloc(&memory_device, 100 * sizeof(float))); // pointer to device

    float* memory_host = new float[100];
    memory_host[2] = 520.25;
    checkRuntime(cudaMemcpy(memory_device, memory_host, sizeof(float) * 100, cudaMemcpyHostToDevice)); // 返回的地址是开辟的device地址,存放在memory_device

    float* memory_page_locked = nullptr;
    checkRuntime(cudaMallocHost(&memory_page_locked, 100 * sizeof(float))); // 返回的地址是被开辟的pin memory的地址,存放在memory_page_locked
    checkRuntime(cudaMemcpy(memory_page_locked, memory_device, sizeof(float) * 100, cudaMemcpyDeviceToHost)); // 

    printf("%f\n", memory_page_locked[2]);
    checkRuntime(cudaFreeHost(memory_page_locked));
    delete [] memory_host;
    checkRuntime(cudaFree(memory_device)); 

    return 0;
}

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

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

相关文章

面试代码——排序算法【建议收藏】

最近家里小朋友准备计算机类的研究生复试&#xff0c;可能会考到常见的排序算法&#xff0c;于是帮助整理一波&#xff0c;顺带复习下相关知识&#xff0c;考验下自己的编码能力&#xff1b; 关于排序算法&#xff0c;网上关于排序算法的帖子和代码也比较多&#xff0c;有的帖…

万字长文介绍R package “vegan”——入门学习与重复文献数据

vegan介绍与入门 vegan是一个用于群落生态学&#xff08;community ecology&#xff09;分析的包&#xff0c;可以进行排序、多样性和差异性分析&#xff08;ordination, diversity and dissimilarity&#xff09;。 vegan包含了多样性分析、排序方法和差异性分析的工具。 示…

L2-043 龙龙送外卖

L2-043 龙龙送外卖 题目描述&#xff1a; 给你n个点&#xff0c;m次询问&#xff0c;n个点构成一棵树 给出n个点&#xff0c;每个点的父节点 你现在在根结点&#xff0c;对于每次询问i&#xff0c;你都要回答&#xff0c;从根结点出发&#xff0c;至少经历1到i次询问的每个点1…

构建用户画像完整版

01 画像平台产品架构 上图是基于快看数据中台画像平台产品的理解和定位整理出来的产品架构。 画像平台首先是服务于业务的&#xff0c;运营可以基于画像平台对单个用户或者人群包做画像的洞察&#xff0c;平台服务的业务应用层包含&#xff1a; &#xff08;1&#xff09;个…

【C++初阶】(入门)命名空间

在C/C中&#xff0c;变量、函数和后面要学到的类都是大量存在的&#xff0c;这些变量、函数和类的名称将都存在于全局作用域中&#xff0c;可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化&#xff0c;以避免命名冲突或名字污染&#xff0c;namespace关键字…

【文章学习系列之模型】FEDformer

本章内容文章概况模型流程主要结构Frequency Enhanced Decomposition Architecture&#xff08;频率增强分解结构&#xff09;Fourier enhanced blocks and Wavelet enhanced blocks&#xff08;傅里叶增强模块和小波增强模块&#xff09;Fourier Enhanced Structure&#xff0…

基于Segment anything的实例分割半自动标注

介绍 使用Meta AI的SAM,并添加了一个基本界面来标记图像,并保存COCO格式的掩码。 源码 https://github.com/anuragxel/salt 安装 安装SAM;创建conda虚拟环境,使用conda env create -f environment.yaml;安装coco-viewer来快速可视化标注结果。使用方法 1、将图片放入到…

WSL下的Kafka开发容器:Docker搭建、API、整合

背景介绍 Kafka是一个分布式流处理平台&#xff0c;可以处理大规模数据流并支持实时数据流的处理。 本文介绍了如何在WSL下使用Docker搭建Kafka容器&#xff0c;并使用Python的kafka-python库和FastAPI框架实现了一个简单的API。同时&#xff0c;还将该服务整合到一个整体的d…

ssm异常处理

ssm异常处理 类上和方法上都要有注解&#xff1a; 类上的注解&#xff1a; 异常处理用到的注解&#xff0c;里面包含了其他的一些必须的注解&#xff0c;详解看下图 方法上的注解&#xff1a; 上面的要懂打配合 现在创建一个处理异常的工具类&#xff0c;加上前面提到的注…

CSRF与SSRF比较

CSRF与SSRF比较 参考&#xff1a;简述CSRF、SSRF的区别 CSRF CSRF&#xff0c;全名 Cross-site requestforgery&#xff0c;也就是 跨站请求伪造。XSS是跨站脚本攻击。与XSS比较&#xff0c;XSS攻击是跨站脚本攻击&#xff0c;CSRF是跨站请求伪造&#xff0c;也就是说CSRF攻…

【Redis】入门篇之相关概念与Redis的安装

目录 一、关系型数据库与非关系型数据库 1、非关系数据库的种类 2、关系型数据库与非关系型数据库的区别 二、认识Redis 1、概念 2、特点 1.键值型 2.单线程 3.低延迟、速度快 4.支持数据持久化 5.支持主从集群、分片集群 6.支持多语言客户端 三、Redis的安装 1、…

IO-IO基础

简介 IO流&#xff0c;以计算机内存为主体&#xff0c;从内存到网络/磁盘等其他地方叫输出流(内存往外出)&#xff1b;网络/磁盘等其他地方写到内存叫输入流&#xff08;往内存输入&#xff09;。 Java中的IO流 4个抽象基类 InputStream/Reader(读到内存里) 所有的输入流的基…

环境变量详解

目录 环境变量是什么&#xff1f; 常见环境变量 查看环境变量 指令查看 代码查看 系统调用查看 本地变量 环境变量全局性 环境变量是什么&#xff1f; 我们要执行一个我们所写的c/c程序时&#xff0c;需要./可执行文件&#xff0c;告诉操作系统你在哪里&#xff0c…

PC Cleaner Pro(电脑清理工具)图文安装教程

OneSafe PC Cleaner 会查找并删除垃圾文件和快捷方式&#xff0c;这些文件和快捷方式会随着时间的推移在您的 PC 上堆积&#xff0c;从而占用您的硬盘空间。该软件会搜索并删除已卸载程序留下的无效快捷方式和文件。OneSafe PC Cleaner 还会识别并删除注册表中不必要的条目。 W…

YOLOv8详解代码实战,附有效果图

YOLOv8架构 YOLOv8 是 ultralytics 公司在 2023 年 1月 10 号开源的 YOLOv5 的下一个重大更新版本&#xff0c;目前支持图像分类、物体检测和实例分割任务&#xff0c;鉴于Yolov5的良好表现&#xff0c;Yolov8在还没有开源时就收到了用户的广泛关注。yolov8的整体架构如下&…

vue3计算属性与监视及watchEffect函数

computed计算属性 首先看一下页面的结构 在v3中可以用v2的方式来写计算属性&#xff0c;但是不建议这么写 而想要在v3中使用计算属性&#xff0c;需要先引入它 它不想之前在v2中的函数了&#xff0c;而是要写在computed()里面 当然这个计算属性是简写&#xff08;没有考虑计算…

Python opencv 先腐蚀后膨胀 消除图像噪声

cv2.getStructuringElement()介绍 在进行图像形态学操作时&#xff0c;首先需要构造一个特定的核&#xff0c;该核可以自定义生成&#xff0c;也可以通过cv2.getStructuringElement()函数构造。 cv2.getStructuringElement(shape, ksize)参数&#xff1a; shape ---- 代表形状…

常见在线AI绘画平台

系列文章目录 Midjourney AI绘画工具使用保姆级教程 本地部署Stable Diffusion教程&#xff0c;亲测可以安装成功 Stable Diffusion界面参数及模型使用 文章目录系列文章目录前言一、Midjourney二、DreamStudio三、Lexica四、STOCKIMG.AI五、Dream by WOMBO六、PicSo七、百…

ArcGIS、ENVI、InVEST、FRAGSTATS等多技术融合提升环境、生态、水文、土地、土壤、农业、大气等领域的数据分析

查看原文>>>ArcGIS、ENVI、InVEST、FRAGSTATS等多技术融合提升环境、生态、水文、土地、土壤、农业、大气等领域的数据分析 目录 专题一、空间数据获取与制图 专题二、ArcGIS专题地图制作 专题三、空间数据采集与处理 专题四、遥感数据处理与应用 专题五、DEM数据…

macOS Big Sur 11.7.6 (20G1231) Boot ISO 原版可引导镜像

本站下载的 macOS 软件包&#xff0c;既可以拖拽到 Applications&#xff08;应用程序&#xff09;下直接安装&#xff0c;也可以制作启动 U 盘安装&#xff0c;或者在虚拟机中启动安装。另外也支持在 Windows 和 Linux 中创建可引导介质。 2023 年 4 月 10 日&#xff08;北京…