CUDA实践指南(一)

简介:

评估您的应用程序:
从超级计算机到手机,现代处理器越来越依赖并行性来提供性能。 核心计算单元(包括控制,算术,寄存器和典型的一些缓存)被复制一定次数并通过网络连接到内存。 因此,所有现代处理器都需要并行代码,以便充分利用其计算能力。
在处理器不断发展以向程序员公开更多细粒度的并行性时,许多现有的应用程序已经发展成为串行代码或粗粒度并行代码(例如,数据分解为并行处理的区域和子区域 使用MPI共享)。 为了从任何现代处理器架构(包括GPU)中获益,首先要评估应用程序以识别热点,确定它们是否可以并行化,并了解现在和将来的相关工作负载。
异构计算:
CUDA编程涉及在两个不同平台上同时运行代码:具有一个或多个CPU和一个或多个支持CUDA的NVIDIA GPU设备的主机系统。
虽然NVIDIA GPU经常与图形相关联,但它们也是强大的算术引擎,能够并行运行数千个轻量级线程。 这种能力使它们非常适合于可以利用并行执行的计算。
但是,该设备基于与主机系统完全不同的设计,因此了解这些差异以及如何确定CUDA应用程序的性能以便有效地使用CUDA非常重要。
主机和设备的区别:
主要区别在于线程模型和单独的物理内存:
线程资源:
主机系统上的执行流水线可以支持有限数量的并发线程。 目前拥有四个六核处理器的服务器可以同时运行24个线程(如果CPU支持超线程,则可以运行48个)。相比之下,CUDA设备上最小的可执行并行单元包含32个线程(称为warp线程)。 现代NVIDIA GPU可以为每个多处理器同时支持多达1536个活动线程(请参阅CUDA C编程指南的功能和规格)在具有16个多处理器的GPU上,这会导致超过24,000个并发活动线程。
线程:
CPU上的线程通常是重量级的实体。 操作系统必须交换CPU执行通道的线程以提供多线程功能。 上下文切换(当两个线程交换时)因此很慢并且很昂贵。 相比之下,GPU上的线程非常轻便。 在典型的系统中,数千个线程正在排队等待工作(每个线程有32个线程)。 如果GPU必须等待一个warp线程,它就会开始在另一个线程上执行工作。 由于单独的寄存器被分配给所有活动线程,因此在GPU线程之间切换时不需要交换寄存器或其他状态。 资源保持分配给每个线程,直到它完成其执行。 简而言之,CPU内核旨在最大限度地减少一个或两个线程的延迟,而GPU旨在处理大量并发的轻量级线程,以最大化吞吐量。
RAM:
主机系统和设备各自具有其自己独特的附加物理存储器。 由于主机和设备存储器被PCI Express(PCIe)总线隔开,主机存储器中的项目必须偶尔通过总线传送到设备存储器,反之亦然。
这些是CPU主机和GPU设备之间在并行编程方面的主要硬件差异。 讨论其他差异,因为它们出现在本文档的其他地方。 考虑到这些差异的应用程序可以将主机和设备组合在一起,将其视为一个内聚的异构系统,其中每个处理单元都可以充分利用其最擅长的工作方式:在主机上进行顺序工作,并在设备上进行并行工作。

相关实践学习
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
目录
相关文章
|
存储 并行计算 内存技术
|
编解码 并行计算 异构计算
|
并行计算 异构计算 存储
|
并行计算 算法 测试技术
|
并行计算 程序员 异构计算
|
并行计算 大数据 机器学习/深度学习
|
并行计算 Linux
|
并行计算 API C语言