【CUDA学习笔记】第一篇:一个基本的CUDA C程序(附配置方法和安装包下载方式)(一)

简介: 【CUDA学习笔记】第一篇:一个基本的CUDA C程序(附配置方法和安装包下载方式)(一)

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)释放主机和设备上使用的所有内存。

相关实践学习
在云上部署ChatGLM2-6B大模型(GPU版)
ChatGLM2-6B是由智谱AI及清华KEG实验室于2023年6月发布的中英双语对话开源大模型。通过本实验,可以学习如何配置AIGC开发环境,如何部署ChatGLM2-6B大模型。
相关文章
手机充电器的兼容性
手机充电器的兼容性主要取决于两个方面:充电器的输出规格和手机的输入规格。
|
6月前
|
人工智能 JavaScript 机器人
OpenClaw阿里云+Windows本地部署保姆级教程:零门槛配置MaxClaw飞书机器人,10分钟解锁自动化
2026年,AI代理工具OpenClaw(原Clawdbot)的生态持续扩容,MiniMax推出的云端版MaxClaw更是颠覆了传统部署模式——无需购买服务器、配置API Key,仅需基础订阅即可快速接入飞书,让普通用户也能10分钟拥有专属AI机器人。但对于需要自定义配置、数据私有化的用户,阿里云部署与Windows本地部署仍是更优选择。
3555 6
|
机器学习/深度学习 传感器 算法
【虚警检测】基于CA-CFAR(单元平均恒虚警)、GO-CFAR(最大选择恒虚警)、SO-CFAR(最小选择恒虚警)算法的恒虚警检测附Matlab代码
【虚警检测】基于CA-CFAR(单元平均恒虚警)、GO-CFAR(最大选择恒虚警)、SO-CFAR(最小选择恒虚警)算法的恒虚警检测附Matlab代码
1675 0
|
12月前
|
机器学习/深度学习 编解码 算法
对三种雷达信号调制类型的识别及MATLAB实现
对三种雷达信号调制类型的识别及MATLAB实现
|
物联网 调度 vr&ar
鸿蒙HarmonyOS应用开发 |鸿蒙技术分享HarmonyOS Next 深度解析:分布式能力与跨设备协作实战
鸿蒙技术分享:HarmonyOS Next 深度解析 随着万物互联时代的到来,华为发布的 HarmonyOS Next 在技术架构和生态体验上实现了重大升级。本文从技术架构、生态优势和开发实践三方面深入探讨其特点,并通过跨设备笔记应用实战案例,展示其强大的分布式能力和多设备协作功能。核心亮点包括新一代微内核架构、统一开发语言 ArkTS 和多模态交互支持。开发者可借助 DevEco Studio 4.0 快速上手,体验高效、灵活的开发过程。 239个字符
1465 13
鸿蒙HarmonyOS应用开发 |鸿蒙技术分享HarmonyOS Next 深度解析:分布式能力与跨设备协作实战
|
并行计算 异构计算
卸载原有的cuda,更新cuda
本文提供了一个更新CUDA版本的详细指南,包括如何查看当前CUDA版本、检查可安装的CUDA版本、卸载旧版本CUDA以及安装新版本的CUDA。
17750 3
卸载原有的cuda,更新cuda
|
缓存 Linux
解决CentOS 7停止更新后yum源失效问题【图文教程】
以上步骤完成后,你的 CentOS 7 系统就会使用阿里云的 yum 源,更换yum以后就可以正常使用啦。
15779 2
|
数据采集 存储 算法
基于BP算法的SAR成像matlab仿真
**摘要:** 基于BP算法的SAR成像研究,利用MATLAB2022a进行仿真。SAR系统借助相对运动合成大孔径,提供高分辨率图像。BP算法执行回波数据预处理、像素投影及图像重建,实现精确成像。优点是高精度和强适应性,缺点是计算量大、内存需求高。代码示例展示了回波生成、数据处理到插值显示的全过程。
|
Cloud Native Java 持续交付
云原生时代的微服务架构实践
在数字化转型的浪潮中,云原生技术已成为推动企业IT现代化的重要力量。本文旨在通过深入浅出的方式,探讨在云原生环境下微服务架构的实践要点,从基础概念到具体实现,带领读者逐步理解并掌握如何在云计算平台上构建、部署和管理高效的微服务应用。我们将一起探索容器化、持续集成/持续部署(CI/CD)等关键技术,并通过实际案例分析,揭示微服务架构带来的业务价值和挑战。无论您是云原生技术的新手,还是希望深化理解的开发者,这篇文章都将为您开启一段云上之旅。
358 1
|
弹性计算
阿里云ECS服务器出网带宽和入网带宽详解及选择
阿里云ECS服务器的带宽是我们自己花钱买的,也叫出网带宽,就是从服务器流出去的带宽。有出就有入,入网带宽说的是从外部流入到服务器的带宽。对于新手不太了解一出一入的关系,以及具体使用情况。本文科普ECS云服务器出网带宽和入网带宽的详细情况。
5932 0
阿里云ECS服务器出网带宽和入网带宽详解及选择