CUDA编程(机械编程)

CUDA编程——简介参考了很多大神的内容,并非完全原创,只是为了查漏补缺,记录自己的学习过程。个人水平有限,错误难免,欢迎讨论。

大家好,又见面了,我是你们的朋友全栈君。

CUDA编程——简介

参考了很多大神的内容,并非完全原创,只是为了查漏补缺,记录自己的学习过程。个人水平有限,错误难免,欢迎讨论。

CUDA(Compute Unified Device Architecture),是由Nvidia推出的通用并行计算架构。 开发人员现在可以使用类C语言来为CUDA™架构编写并行程序!


1 CUDA编程

CUDA编程允许你的程序执行在异构系统上,即CPU和GPU,二者有各自的存储空间,并由PCI-Express 总线区分开。因此,我们应该先注意二者术语上的区分:

  • Host:CPU and itsmemory (host memory)
  • Device: GPU and its memory (device memory))

代码中,一般用h_前缀表示host memory,d_表示device memory。

kernel是CUDA编程中的关键,他是运行GPU设备上的代码,用标示符global修饰。
host可以独立于host进行大部分操作。当一个kernel启动后,控制权会立刻返还给CPU来执行其他额外的任务。所以,CUDA编程是异步的。一个典型的CUDA程序包含由并行代码补足的串行代码,串行代码由host执行,并行代码在device中执行。host端代码是标准C,device是CUDA C代码。我们可以把所有代码放到一个单独的源文件,也可以使用多个文件或库。NVIDIA C编译器(nvcc)可以编译host和device生成可执行程序。

这里再次说明下CUDA程序的处理流程:

  1. 从CPU拷贝数据到GPU。
  2. 调用kernel来操作存储在GPU的数据。
  3. 将操作结果从GPU拷贝至CPU。

2 Memory操作

cuda程序将系统区分成host和device,二者有各自的memory。kernel可以操作device memory,为了能很好的控制device端内存,CUDA提供了几个内存操作函数,为了保证和易于学习,CUDA C 的风格跟C很接近:

标准C CUDA C
malloc cudaMalloc
memcpy cudaMemcpy
memset cudaMemset
free cudaFree

我们主要看看cudaMencpy,其函数原型为:

cudaError_t cudaMemcpy ( void* dst, const void* src, size_t count,cudaMemcpyKind kind )

其中cudaMemcpykind的可选类型有:

cudaMemcpyHostToHost
cudaMemcpyHossToDevice
cudaMemcpyDeviceToHost
cudaMemcpuDeviceToDevice

对于返回类型cudaError_t,如果正确调用,则返回cudaSuccess,否则返回cudaErrorMemoryAllocation。可以使用char* cudaGetErrorString(cudaError_t error)将其转化为易于理解的格式。


3 CUDA线程层次

CUDA线程分成Grid和Block两个层次,由一个单独的kernel启动的所有线程组成一个grid,grid中所有线程共享global memory。一个grid由许多block组成,每个block由许多线程组成,grid和block都可以是一维二维或者三维。
CUDA编程(机械编程)
这里介绍几个CUDA内核函数的私有变量:
– blockIdx:block的索引,blockIdx.x表示block的x坐标。
– threadIdx:线程索引,同理blockIdx。
– blockDim:block维度,上图中blockDim.x=5.
– gridDim:grid维度,同理blockDim。


4 启动CUDA Kernel函数

CUDA kernel的调用格式为:

kernel_name<<<grid, block>>>(argument list);

其中grid和block即为上文中介绍的类型为dim3的变量。通过这两个变量可以配置一个kernel的线程总和,以及线程的组织形式。例如:

kernel_name<<<4, 8>>>(argumentt list);

该行代码表明有grid为一维,有4个block,block为一维,每个block有8个线程,故此共有4*8=32个线程。

注意,不同于c函数的调用,所有CUDA kernel的启动都是异步的,当CUDA kernel被调用时,控制权会立即返回给CPU。
kernel的限制:

  • 仅能获取device memory 。
  • 必须返回void类型。
  • 不支持可变数目参数。
  • 不支持静态变量。
  • 不支持函数指针。
  • 异步。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/126995.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 对于多层神经网络,BP算法的直接作用_什么是多层神经网络

    对于多层神经网络,BP算法的直接作用_什么是多层神经网络多层神经网络BP算法原理及推导转载;https://www.cnblogs.com/liuwu265/p/4696388.html首先什么是人工神经网络?简单来说就是将单个感知器作为一个神经网络

    2022年8月3日
    6
  • ffmeg_facet的意思

    ffmeg_facet的意思音频文件转码简介本文描述如何从其它格式的音频转成符合语音识别输入要求格式的音频文件。由于底层识别使用的是pcm,因此推荐直接上传pcm文件。如果上传其它格式,会在服务器端转码成pcm,调用接口的耗时会增加。语音识别仅支持以下格式:pcm(不压缩)、wav(不压缩,pcm编码)、amr(有损压缩格式);8k/16k采样率16bit位深的单声道。即:pcmwavamr格式三选一。 正常情

    2022年9月25日
    2
  • 51单片机按键控制步进电机加减速及正反转

    51单片机按键控制步进电机加减速及正反转之前尝试用单片机控制42步进电机正反转,电机连接导轨实现滑台前进后退,在这里分享一下测试程序及接线图,程序部分参考网上找到的,已经实际测试过,可以实现控制功能。所用硬件:步进电机及驱动器、STC89C52单片机、直流电源1、硬件连接图注意:上图为共阳极接法,实际连接参考总体线路连接。 驱动器信号端定义:PUL+:脉冲信号输入正。(C…

    2022年6月1日
    48
  • 软件测试工程师面试自我介绍部分模板

    软件测试工程师面试自我介绍部分模板自我介绍大致格式是 面试官你好 我叫 XX 学校排名比较好的可以提一下毕业院校 计算机专业毕业后 做软件测试工作有 X 年了 首先感谢您能给我这次面试机会 就职过的公司 负责过哪些项目 挑重点的 大型的 你比较熟悉的项目说 的哪些测试工作 后面就是你的简历里面写的关于个人技能的那些东西 感觉内容不够的话就说下你常用的测试工具和缺陷管理工具 最后再礼貌的加上我的自我介绍已完毕 您看我还有什么需要补充的吗 附我个人的自我介绍 话说前头 我菜的一批 我的自我介绍仅供参考 面试官你好 我是 XX 计算机专业

    2025年8月3日
    2
  • “国产Linux“的终结

    “国产Linux“的终结

        现今,“国产Linux”不见了,也不再有人提起了,人们的思想获得了大解放。此话根据何在?
     
         6月29日,《2010‘开源中国,开源世界》高峰论坛在北京举行。高峰论坛的议事议程及其特意安排充分显示出,在我国开源发展历史上,这次会议是一个具有特殊意义的发展里程碑。近半年来,我国

    2022年5月13日
    39
  • 小白入门——“贪吃蛇”的C语言实现(详细)

    小白入门——“贪吃蛇”的C语言实现(详细)C语言实现,编译环境VS2017附:easyx图形化(文章末尾)效果图如下(有一些函数kbhit,getch,在这表示为_kbhit与_getch)//不同编译器原因注意在Dev等集成开发软件下可能会CEo(* ̄▽ ̄*)o一、引言作为一个小白,相信大家的心情都是一样的,渴望写一个人生的第一个“贪吃蛇”。…

    2022年5月26日
    43

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号