关于CUDA中cudaMalloc函数的参数问题

很多小伙伴在学习CUDA时接触到的第一个API:cudaMalloc会有疑问,第一个参数为地址指针。关于这个地址指针,今天通过这篇文章阐述我的理解。

cudaMalloc的原型为: cudaError_t cudaMalloc(void** devPtr, size_t size)
这个API与C语言中的malloc大同小异。malloc用法为:
int *a = (int )malloc(nsizeof(int)),返回的是一个int型指针,指向大小为n个int型数据的连续内存地址的首地址,可以理解为a是这个数组的首地址。

理解了这个有利于理解cudaMalloc的参数。我们在进行cuda编程时,第一步需要在GPU内分配内存,与数组的声明步骤是一样的。

假如我们要在GPU内申明一段n个大小的float型数组,我们需要定义float *addr,用于指向GPU内这个地址的首地址。因此,addr这个变量中存的就是用户在GPU中声明的float型数组的首地址。

我们需要通过cudaMalloc来改变addr中存的内容,准确地找出GPU中这个数组的首地址。正确的调用方法为:cudaMalloc(float(**)&addr,n*sizeof(float))

下面对它进行完整的解释:
第二个参数大家都知道具体意思了。第一个参数我们首先看到的是&addr。前面我们假设addr内部存放的是一个指向GPU中的数组的首地址,需要对addr的内容进行改变,因此我们必须采用引用的方式进行形参传递。否则,完成了cudaMalloc函数调用后仅仅是形参的值发生变化(参考C语言学习中的引用调用),原来我们声明的float *addr这个实参没有发生任何变化。注意:我们需要的是把addr指针的内容改变,而函数原型的devPtr返回的是地址的值,因此需要通过对addr这个指针进行引用调用,改变其内部的值。

理解了上面的内容,接着是强制类型转换成指针型指针的理解,就简单多了。前面说过,addr是指向地址的指针。cudaMalloc完成了*addr的内容的改变后,需要转换数据类型。把它转换成指针型指针是对于主机端而言的(GPU称为设备端),addr这个变量是指向我们在GPU内部声明的连续地址的首地址,因此,我们对addr进行第一次引用计算,得到的是首地址的值。我们需要通过这个值来在GPU的内存进行操作,因此需要再做一次引用计算,得到的就是GPU中连续地址的第一个单元,接下来就可以进行主机端设备端的内存内容拷贝了。

之所以这样设计,是因为在cudaMemcpy内存拷贝函数中,采用的形参均是地址。这个函数的原型为:

cudaError_t cudaMemcpy(void *dist, const void* src,size_t count,CudaMemcpyKind kind)

前两个参数分别是目的地址和源地址。完成了内存声明后,我们把addr作为形参,这时,dist指针指向了addr的地址。对dist做引用运算后,返回的就是我们声明好的GPU内存的首地址了。

总结:
cudaMalloc的参数与我们设置的地址类型数据有一定的关系。由于cudaMemcpy等重要的内存操作函数均以指针作为形参,因此我们需要定义一个与之相同类型的指针完成形参赋值。
由于指针是指向地址的,必须把我们声明的指针变量初始化为GPU的内存首地址。这样一来,addr实质上就变成了一个存放了地址的指针
这也决定了cudaMalloc函数调用时,需要对addr进行引用计算,将GPU内存首地址放在addr指向的地址中。完成了这个函数调用后,addr就变成了一个指向GPU内存首地址的地址(指针)了。

CUDA入门——cudaMalloc函数的理解相关推荐

  1. CUDA入门3.2——使用CUDA实现鱼眼转全景图(CUDA环节)1227更

    算法 算法借鉴了Converting a fisheye image into a panoramic, spherical or perspective projection,核心内容如下: Sof ...

  2. CUDA入门之2022CUDA夏令营QA专场

    参加CUDA On Arm Platform 线上夏令营学习笔记(三) 致谢 QA环节 20220704 20220705 20220706 20220707 20220708 20220709 致谢 ...

  3. Cuda束表决函数(warp vote)

    CUDA束表决函数 束表决函数:简单的理解就是在一个warp内进行表决 __all(int predicate):指的是predicate与0进行比较,如果当前线程所在的Wrap所有线程对应predi ...

  4. 风辰的CUDA入门系列教程

    风辰的CUDA入门系列教程 1. CUDA简介 GPU是图形处理单元(Graphic Processing Unit)的简称,最初主要用于图形渲染.自九十年代开始,GPU的发展产生了较大的变化,NVI ...

  5. cuda入门——改良第一个 CUDA程序

    cuda入门--改良第一个 CUDA程序 在上篇中,我们做了一个计算一大堆数字的平方和的程序.不过,我们也提到这个程序的执行效率并不理想.当然,实际上来说,如果只是要做计算平方和的动作,用 CPU 做 ...

  6. 二元函数泰勒公式例题_高等数学入门——二元函数可微性的判断方法总结

    系列简介:这个系列文章讲解高等数学的基础内容,注重学习方法的培养,对初学者不易理解的问题往往会不惜笔墨加以解释.在内容选取上,以国内的经典教材"同济版高等数学"为蓝本,并对具体内容 ...

  7. CPU和GPU及CUDA入门基础概念

    CPU与GPU 1 CPU与GPU的关系:smile: 1.1 CPU与GPU各自特点 2 一些零碎的CUDA入门知识:blush: 2.1 函数修饰符 2.2 线程.线程快.线程格 2.3 什么是核 ...

  8. cuda入门——记录

    学习目标: cuda入门学习 记录一下看到的比较好的文章(个人记录用) 学习内容: 一些比较好的文章链接 例如: Cuda入门 Cuda入门 CUDA实现矩阵加法 CUDA实现矩阵加法 [CUDA编程 ...

  9. javascript 匿名函数的理解

    代码如下: (function(){ //这里忽略jQuery所有实现 })(); (function(){ //这里忽略jQuery所有实现 })(); 半年前初次接触jQuery的时候,我也像其他 ...

最新文章

  1. git clone 加速小技巧
  2. Linux KVM与Xen的性能比较
  3. zabbix监控-基本原理介绍
  4. html5app大赛,Anyoffice -HTML5大赛 悦心(基于H5开发安卓音乐app)-项目总结
  5. PyTorch官方教程中文版
  6. 八种常用排序算法参考
  7. 若依微服务版 数据库设计说明书
  8. 高分三号卫星GF-3极化SAR
  9. 2021 Java面试真题集锦
  10. 红外额温枪方案(包含原理图和PCB文件)
  11. 优雅的处理你的Java异常
  12. “另类”计算IP地址和子网划分
  13. 医门凿眼----痹症勾沉
  14. 利用matlab快速实现连续系统转变为离散系统(z变换)
  15. 从获评毕马威中国领先地产科技50强 看贝壳的长期主义
  16. 搜索-Query理解(全)
  17. n2n内网穿透及代理服务
  18. 游戏检测到计算机性能过低配色,重装系统后提示是否更改配色方案提高性能怎么办...
  19. 第一类斯特林数和第二类斯特林数
  20. 好例子网vip_使用示例清洁Swift VIP

热门文章

  1. linux mint 版本区别,Linux Mint 20选Cinnamon、MATE还是Xfce版本?以下为你解析
  2. NFT 游戏互操作性:技术不是拦路虎
  3. 计算机管理咂打开,资源管理器/文件夹,突然自动打开,无法缩小或关闭,之前已打开运行...
  4. 【数字IC验证进阶】SoC系统验证和IP模块验证的区别及侧重点分析
  5. 第十七章 高级数据表示
  6. 小米手机无法连接eclipse调试解决方案
  7. uni-app禁用返回按钮/返回键
  8. 机器学习识别身份证信息代码
  9. 12. RDMA之Verbs
  10. 我的狐仙老婆——游魂 -Kiss on my Deity-汉化第二版