【CUDA 基础】4.2 内存管理

news/2024/7/20 15:06:40 标签: python, 内存管理, c/c++

title: 【CUDA 基础】4.2 内存管理
categories:
- CUDA
- Freshman
tags:
- CUDA内存管理
- CUDA内存分配和释放
- CUDA内存传输
- 固定内存
- 零拷贝内存
- 统一虚拟寻址
- 统一内存寻址
toc: true
date: 2018-05-01 21:39:47

weixingongzhonghao.jpg
Abstract: 本文主要介绍CUDA内存管理,以及CUDA内存模型下的各种内存的特点。
Keywords: CUDA内存管理,CUDA内存分配和释放,CUDA内存传输,固定内存,零拷贝内存,统一虚拟寻址,统一内存寻址

开篇废话

迷茫和困惑会影响我们的前进,彻底摆脱也许不太可能,但是我们必须肯定信仰的力量,专注你所热爱的,就会走出迷雾。

CUDA编程的目的是给我们的程序加速,尤其是机器学习,人工智能类的计算,CPU不能高效完成,说白了,我们在控制硬件,控制硬件的语言属于底层语言,比如C语言,最头疼的就是管理内存,python,php这些语言有自己的内存管理机制,c语言的内存管理机制——程序员管理。这样的好处是学起来特别困难,但是学会了又会觉得特别爽,因为自由,你可以随意的控制计算机的计算过程。CUDA是C语言的扩展,内存方面基本集成了C语言的方式,由程序员控制CUDA内存,当然,这些内存的物理设备是在GPU上的,而且与CPU内存分配不同,CPU内存分配完就完事了,GPU还涉及到数据传输,主机和设备之间的传输。
接下来我们要了解的是:

  • 分配释放设备内存
  • 在主机和设备间传输内存

为达到最优性能,CUDA提供了在主机端准备设备内存的函数,并且显式地向设备传递数据,显式的从设备取回数据。

内存分配和释放

内存的分配和释放我们在前面已经用过很多次了,前面所有的要计算的例子都包含这一步:

cudaError_t cudaMalloc(void ** devPtr,size_t count)

这个函数用过很多次了,唯一要注意的是第一个参数,是指针的指针,一般的用法是首先我们生命一个指针变量,然后调用这个函数:

float * devMem=NULL;
cudaError_t cudaMalloc((float**) devMem, count)

这里是这样的,devMem是一个指针,定义时初始化指向NULL,这样做是安全的,避免出现野指针,cudaMalloc函数要修改devMem的值,所以必须把他的指针传递给函数,如果把devMem当做参数传递,经过函数后,指针的内容还是NULL。
不知道这个解释有没有听明白,通俗的讲,如果一个参数想要在函数中被修改,那么一定要传递他的地址给函数,如果只传递本身,函数是值传递的,不会改变参数的值。
内存分配支持所有的数据类型,什么int,float。。。这些都无所谓,因为他是按照字节分配的,只要是正数字节的变量都能分配,当然我们根本没有半个字节的东西。
函数执行失败返回:cudaErrorMemoryAllocation.
当分配完地址后,可以使用下面函数进行初始化:

cudaError_t cudaMemset(void * devPtr,int value,size_t count)

用法和Memset类似,但是注意,这些被我们操作的内存对应的物理内存都在GPU上。
当分配的内存不被使用时,使用下面语句释放程序。

cudaError_t cudaFree(void * devPtr)

注意这个参数一定是前面cudaMalloc类的函数(还有其他分配函数)分配到空间,如果输入非法指针参数,会返回 cudaErrorInvalidDevicePointer 错误,如果重复释放一个空间,也会报错。
目前为止,套路基本和C语言一致。但是,设备内存的分配和释放非常影响性能,所以,尽量重复利用!

内存传输

完整内容参考https://face2ai.com/CUDA-F-4-2-内存管理/

转载于:https://www.cnblogs.com/face2ai/p/9756618.html


http://www.niftyadmin.cn/n/1697695.html

相关文章

Office EXCEL VBA数组如何使用

Excel VBA数组入门教程 1. 前言:不要把VBA数组想的太神秘,它其实就是一组数字而已。 2. 数组的维数: Sub 数组示例() Dim x As Long, y As Long Dim arr(1 To 10, 1 To 3) 创建一个可以容下10行3列的数组空间 For x 1 To 4 For y …

剑指 Offer 39. 数组中出现次数超过一半的数字 简单易懂14行搞定 。人人皆可会

这里写目录标题一、 哈希表统计次数14行通过,简单易懂二、题目信息三、解题思路四、代码五、提交结束一、 哈希表统计次数14行通过,简单易懂 二、题目信息 三、解题思路 利用哈希表K,V的特性遍历每一个数字,K是数字的值,V是这个数…

MindManager使用技巧

任务窗格在右下角。 1.条件的设置与编辑 2.优先级视图 不是优先级图标 3.圆圈图 4.洋葱图的使用 右键选择背景再选择解锁所有背景就可以对所有圆形进行调整了 点图形边缘出现十字架可以进行移动 5.个性化旅行表制作 新建里找到个人效率模版 然后选择差旅计划 6.链接的使用 7.云…

新学期预习吗? 数据结构集合框架及Colletcion接口实例详解

) 文章目录一、集合框架介绍二、Collection接口常用方法2.1、 增加一个元素2.2、如果e出现在集合里,删除其中一个。2.3 、判空方法2.4、获取当前集合的元素2.5、toArray方法2.6、是否包含某元素2.7、删除所有集合元素三、Collecion实例四、结尾一、集合框架介绍 Jav…

php 实现将文本、图片写到同一张图上面以及文本的自动换行

以laravel框架为例: 首先controller中引用ImageManager; use Intervention\Image\ImageManager; 下面就是关键处理, $date date(Y年m月d日 H:i, $data[time]);$title $data[title];$content $data[content];$id $data[id]; //原图地址-画…

新学期预习吗?数据结构集合框架Map的方法和实例讲解

文章目录一、Map接口1.1、概念和应用场景1.2、Map的两种模型1.3、 Map接口和其他集合框架的继承关系1.4、Map接口的说明二、Map常用的方法2.1、put(K key,V value) 将指定的KV对放进map2.2、getOrDefault(Object K,V defaultValue)2.3、boolean containsValue(Object K)2.4、bo…

.NET Core Community 第三个千星项目诞生:爬虫 DotnetSpider

本文所有打赏将全数捐赠于 NCC(NCC 的资金目前由 倾竹大人 负责管理),请注明捐赠于 NCC。捐赠情况将由倾竹大人在此处公示。 DotnetSpider 至力于打造一个轻量化、高效率、易开发、可管理的一体化爬虫框架。它的核心要素是URL调度、基本的网页…

什么?动态规划10行求出连续子数组的最大和 剑指offer-42讲解

剑指offer_42一、题目信息二、解法三、代码实现一、题目信息 题目意思就是要求出连续子数组的最大和,并且返回这个和。 二、解法 有三种方法都可以解这道题,第一种是暴力搜索,但是它的时间复杂度非常高有O(n^2),第二…