0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

CUDA学习笔记第一篇:一个基本的CUDA C程序

电子设计 来源:电子设计 作者:电子设计 2020-12-14 23:40 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

来源:AI人工智能初学者
作者:ChaucerG

目录

1、CUDA的简介
2、GPU架构和CUDA介绍
3、CUDA架构
4、开发环境说明和配置
5、开始第一个Hello CUDA程序
5.1、VS2017创建NVIDIA CUDA项目
5.2、VS2017中输入 CUDA代码(附.cu代码以及讲解)
5.3、VS2017生成并开始执行
参考

1、CUDA的简介

计算统一设备架构(Compute Unified Device Architecture,CUDA)是由英伟达(NVIDIA)开发的一套非常流行的并行计算平台和编程模型。它只支持NVIDIA GPU卡。OpenCL则用来为其他类型的GPU编写并行代码,比如AMD英特尔,但它比CUDA更复杂。CUDA可以使用简单的编程API在图形处理单元(GPU)上创建大规模并行应用程序。

使用C和C++的软件开发人员可以通过使用CUDA C或C++来利用GPU的强大性能来加速他们的软件应用程序。用CUDA编写的程序类似于用简单的C或C++编写的程序,添加需要利用GPU并行性的关键字。CUDA允许程序员指定CUDA代码的哪个部分在CPU上执行,哪个部分在GPU上执行。

2、GPU架构和CUDA介绍

GeForce 256是英伟达于1999年开发的第一个GPU。最初只用在显示器上渲染高端图形。它们只用于像素计算。后来,人们意识到如果可以做像素计算,那么他们也可以做其他的数学计算。现在,GPU除了用于渲染图形图像外,还用于其他许多应用程序中。这些GPU被称为通用GPU(GPGPU)。

CPU具有复杂的控制硬件和较少的数据计算硬件。复杂的控制硬件在性能上提供了CPU的灵活性和一个简单的编程接口,但是就功耗而言,这是昂贵的。而另一方面,GPU具有简单的控制硬件和更多的数据计算硬件,使其具有并行计算的能力。这种结构使它更节能。缺点是它有一个更严格的编程模型。在GPU计算的早期,OpenGL和DirectX等图形API是与GPU交互的唯一方式。对于不熟悉OpenGL或DirectX的普通程序员来说,这是一项复杂的任务。这促成了CUDA编程架构的开发,它提供了一种与GPU交互的简单而高效的方式。

一般来说,任何硬件架构的性能都是根据延迟和吞吐量来度量的。延迟是完成给定任务所花费的时间,而吞吐量是在给定时间内完成任务的数量。这些概念并不矛盾。通常情况下,提高一个,另一个也会随之提高。在某种程度上,大多数硬件架构旨在提高延迟或吞吐量。

同样,正常的串行CPU被设计为优化延迟,而GPU被设计为优化吞吐量。CPU被设计为在最短时间内执行所有指令,而GPU被设计为在给定时间内执行更多指令。GPU的这种设计理念使它们在图像处理和计算机视觉应用中非常有用,这也是本书的目的,因为我们不介意单个像素处理的延迟。我们想要的是在给定的时间内处理更多的像素,这可以在GPU上完成。

综上所述,如果我们想在相同的时钟速度和功率要求下提高计算性能,那么并行计算就是我们所需要的。GPU通过让许多简单的计算单元并行工作来提供这种能力。现在,为了与GPU交互,并利用其并行计算能力,我们需要一个由CUDA提供的简单的并行编程架构。

3、CUDA架构

CUDA架构包括几个专门为GPU通用计算而设计的特性,这在早期的架构中是不存在的。它包括一个unified shedder管道,它允许GPU芯片上的所有算术逻辑单元(ALU)被一个CUDA程序编组。ALU还被设计成符合IEEE浮点单精度和双精度标准,因此它可以用于通用应用程序。指令集也适合于一般用途的计算,而不是特定于像素计算。它还允许对内存的任意读写访问。这些特性使CUDA GPU架构在通用应用程序中非常有用。

所有的GPU都有许多被称为核心(Core)的并行处理单元。

在硬件方面,这些核心被分为流处理器和流多处理器。GPU有这些流多处理器的网格。

在软件方面,CUDA程序是作为一系列并行运行的多线程(Thread)来执行的。每个线程都在不同的核心上执行。可以将GPU看作多个块(Block)的组合,每个块可以执行多个线程。每个块绑定到GPU上的不同流多处理器。

CUDA程序员不知道如何在块和流多处理器之间进行映射,但是调度器知道并完成映射。来自同一块的线程可以相互通信。GPU有一个分层的内存结构,处理一个块和多个块内线程之间的通信。这将在接下来的章节中详细讨论。

作为一名程序员,你会好奇CUDA中的编程模型是什么,以及代码将如何理解它是应该在CPU上执行还是在GPU上执行。我们将CPU及其内存称为主机(Host),GPU及其内存称为设备(Device)。CUDA代码包含主机和设备的代码。主机代码由普通的C或C++编译器在CPU上编译,设备代码由GPU编译器在GPU上编译。主机代码通过所谓的内核调用调用设备代码。它将在设备上并行启动多个线程。在设备上启动多少线程是由程序员来决定的。

现在,你可能会问这个设备代码与普通C代码有何不同。答案是,它类似于正常的串行C代码。只是这段代码是在大量内核上并行执行的。然而,要使这段代码工作,它需要设备显存上的数据。因此,在启动线程之前,主机将数据从主机内存复制到设备显存。线程处理来自设备显存的数据,并将结果存储在设备显存中。最后,将这些数据复制回主机内存进行进一步处理。综上所述,CUDA C程序的开发步骤如下:

1)为主机和设备显存中的数据分配内存。
2)将数据从主机内存复制到设备显存。
3)通过指定并行度来启动内核。
4)所有线程完成后,将数据从设备显存复制回主机内存。
5)释放主机和设备上使用的所有内存。

4、开发环境说明和配置

先决条件:

1、电脑具有支持cuda的GPU(一般具有独立显卡就可以,不过最好不要太老的版本);
2、英伟达显卡驱动;
3、标准C编译器;
4、CUDA开发工具包。

windows10下cuda工具包的安装:

1、MicroSoft Visio Studio 2017的安装(也可以是其他的版本,笔者使用的是2017)
2、下载cuda10.1安装包(最新的是10.2);
3、直接点击.exe文件进行安装,选择自定义安装,所有选项均勾选;
4、配置CUDA系统环境变量(和配置深度学习环境一样配置系统环境变量)。

5、开始第一个Hello CUDA程序

5.1、VS2017创建NVIDIA CUDA项目

步骤如下:

1)打开Microsoft Visual Studio。
2)进入File|New|Project。
3)依次选择NVIDIA|CUDA 10.1|CUDA 10.1 Runtime。
4)为项目自定义名称,然后单击OK按钮。
5)它将创建一个带有kernel.cu示例文件的项目。现在双击打开这个文件。
6)从文件中删除现有代码,写入前面编写的那段代码。
7)从生成(Build)选项卡中选择生成(build)进行编译,并按快捷键Ctrl+F5调试代码。

5.2、VS2017中输入 CUDA代码

#include

与C编程的区别:

1)一个名为myfirstkernel的空函数,前缀为/_/_global/_/_

2)使用<<1,1>>>调用myfirstkernel函数

/_/_global/_/_是CUDA C在标准C中添加的一个限定符,它告诉编译器在这个限定符后面的函数定义应该在设备上而不是在主机上运行。在前面的代码中,myfirstkernel将运行在设备上而不是主机上,但是,在这段代码中,它是空的。

那么,main函数将在哪里运行?NVCC编译器将把这个函数提供给C编译器,因为它没有被global关键字修饰,因此main函数将在主机上运行。

代码中的第二个不同之处在于对空的myfirstkernel函数的调用带有一些尖括号和数值。这是一个CUDA C技巧:从主机代码调用设备代码。它被称为内核调用。内核调用的细节将在后面的章节中解释。尖括号内的值表示我们希望在运行时从主机传递给设备的参数。基本上,它表示块的数量和将在设备上并行运行的线程数。因此,在这段代码中,<<<1,1>>>表示myfirstkernel将运行在设备上的一个块和一个线程或块上。虽然这不是对设备资源的最佳使用,但是理解在主机上执行的代码和在设备上执行的代码之间的区别是一个很好的起点。

让我们再来重温和修改“Hello,CUDA!”代码,myfirstkernel函数将运行在一个只有一个块和一个线程或块的设备上。它将通过一个称为内核启动的方法从main函数内部的主机代码启动。

5.3、VS2017生成并开始执行

审核编辑 黄昊宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • gpu
    gpu
    +关注

    关注

    28

    文章

    5102

    浏览量

    134481
  • 人工智能
    +关注

    关注

    1813

    文章

    49756

    浏览量

    261671
  • CUDA
    +关注

    关注

    0

    文章

    125

    浏览量

    14405
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    RV生态又里程碑:英伟达官宣CUDA将兼容RISC-V架构!

    Frans Sijstermanns宣布了则重磅消息:英伟达要将CUDA移植到RISC-V架构上。   英伟达每年出货超10亿颗RISC-V MCU
    的头像 发表于 07-19 00:04 6166次阅读
    RV生态又<b class='flag-5'>一</b>里程碑:英伟达官宣<b class='flag-5'>CUDA</b>将兼容RISC-V架构!

    【社区之星】宿晶亮——一个人的爱好,足以点燃不设限的学习热情

    手册、啃文档,再到在 某C网站 上写下第一篇技术笔记,我花了年。那年,我重新拾起了遗失在时空裂缝中、尘封二十年的单片机记忆。 后来,我在
    发表于 12-03 18:11

    首款全国产训推体AI芯片发布,兼容CUDA生态

    电子发烧友网综合报道 中诚华隆近日正式发布HL系列全国产AI芯片及全栈智算新品,标志着我国智算领域迎来全新发展阶段。作为首款全国产训推体AI芯片,HL100凭借自研的新代GPGPU+NPU融合
    的头像 发表于 11-30 07:20 8865次阅读
    首款全国产训推<b class='flag-5'>一</b>体AI芯片发布,兼容<b class='flag-5'>CUDA</b>生态

    Nature传感器新子刊第一篇论文出炉,中国青年学者联手撰写

        近期,知名学术期刊《Nature》(《自然》)旗下专注于传感器研究领域的子刊《Nature Sensors》,刊发了创刊以来的第一篇论文。     《Nature Sensors》是今年4
    的头像 发表于 11-27 15:04 288次阅读
    Nature传感器新子刊<b class='flag-5'>第一篇</b>论文出炉,中国青年学者联手撰写

    Linux 下交叉编译实战:跑起来你的第一个 STM32 程序

    跑起来你的第一个STM32程序、准备工作在开始之前,需要准备:1、Linux开发环境Ubuntu、Debian或其他主流发行版都可以。2、ARMGCC交叉编译工具
    的头像 发表于 11-24 19:04 262次阅读
    Linux 下交叉编译实战:跑起来你的<b class='flag-5'>第一个</b> STM32 <b class='flag-5'>程序</b>

    **CW32L012****开发评估板的第一个程序**

    CW32L012****开发评估板的第一个程序 最近以15.99在CW32生态社区入手了这块CW32L012开发评估板,我迫不及待的烧录进电灯程序,看看这块板子是否是正常的,能否满足我后面的
    发表于 11-22 00:09

    【「高速数字设计(基础)」阅读体验】 + 书籍评测第一篇

    本帖最后由 jf_45494258 于 2025-11-9 11:02 编辑 很开心第一次参加电子发烧友举办的书籍测评活动,十分感谢!说小插曲,书籍已经到了好久,我还以为十一月初才发货
    发表于 11-09 10:31

    英伟达:CUDA 已经开始移植到 RISC-V 架构上

    ,着重介绍了将 CUDA 移植到 RISC-V 架构的相关工作和计划,展现了对 RISC-V 架构的高度重视与积极布局。   Frans Sijstermanns 首先回顾了英伟达与 RISC-V 之间
    发表于 07-17 16:30 3847次阅读

    功德+1,用小安派-Eyes-S1做一个电子木鱼

    木鱼声响,烦恼走光光~敲电子木鱼,品赛博人生,今天你的功德积累到多少了?2024年的第一篇教程来了,本篇学习如何添加LVGL事件,并制作完成
    的头像 发表于 04-09 18:38 784次阅读
    功德+1,用小安派-Eyes-S1做<b class='flag-5'>一个</b>电子木鱼

    使用NVIDIA CUDA-X库加速科学和工程发展

    NVIDIA GTC 全球 AI 大会上宣布,开发者现在可以通过 CUDA-X 与新代超级芯片架构的协同,实现 CPU 和 GPU 资源间深度自动化整合与调度,相较于传统加速计算架构,该技术可使计算工程工具运行速度提升至原来的 11 倍,计算规模增加至 5 倍。
    的头像 发表于 03-25 15:11 1217次阅读

    STM32Cube学习笔记 (十六全)

    资料介绍: STM32Cube学习笔记步手把手带你进入STM32Cube的世界,包括点灯,按键,串口,ADC,DAC等等共16
    发表于 03-22 17:02

    硅光第一篇:可调谐激光源

    作者:顾磊在1970年,美国康宁公司实现了项突破性进展,它将高锟博士的光纤理论转化为现实,成功制造出世界上首根低损耗光纤,这成就开启了光纤通信的新纪元。随着光纤通信技术的迅猛发展,可调谐激光器在
    的头像 发表于 03-05 10:20 1295次阅读
    硅光<b class='flag-5'>第一篇</b>:可调谐激光源

    借助PerfXCloud和dify开发代码转换器

    随着深度学习与高性能计算的迅速发展,GPU计算的广泛应用已成为推动技术革新的股重要力量。对于GPU编程语言的选择,CUDA和HIP是目前最为流行的两种选择。CUDA是由NVIDIA推
    的头像 发表于 02-25 09:36 1382次阅读
    借助PerfXCloud和dify开发代码转换器

    优秀学习笔记分享:正弦信号放大抬升,有计算有验证,更有颗爱学习的认真劲儿!

    这是非常认真的学习笔记,来自《运放秘籍》学员: 喜欢吃蛋炒饭 ,现在分享给大家。 学习
    的头像 发表于 02-19 11:55 1256次阅读
    优秀<b class='flag-5'>学习</b><b class='flag-5'>笔记</b>分享:正弦信号放大抬升,有计算有验证,更有<b class='flag-5'>一</b>颗爱<b class='flag-5'>学习</b>的认真劲儿!

    学习硬件的第一节课:学习读懂原理图

    学习硬件的第一节课:学习读懂原理图 读懂原理图对嵌入式软件工程师和程序员尤为重要。在深入细节之前请注意,对所有的嵌入式设计人员来说、能懂得硬件工程师创建和使用的来描述其硬件设计的原理图
    的头像 发表于 12-16 16:04 3683次阅读
    <b class='flag-5'>学习</b>硬件的<b class='flag-5'>第一</b>节课:<b class='flag-5'>学习</b>读懂原理图