Fiori-like Prototype ( Nvidia CUDA C / C++ )
Play with Visual C / C++
Model rendering
Demos / Prototypes / Mockups
ZFiori Studio ( Nvidia CUDA C/C++ Mockups ) S1
Nvidia CUDA Community
CUDA 是 NVIDIA 发明的一种并行计算平台和编程模型。它通过利用图形处理器 (GPU) 的处理能力,可大幅提升计算性能。
2006 年 11 月,NVIDIA? 推出了 CUDA?,这是一种通用并行计算平台和编程模型,它利用 NVIDIA GPU 中的并行计算引擎以比 CPU 更有效的方式解决许多复杂的计算问题。
CUDA 附带一个软件环境,允许开发人员使用 C++ 作为高级编程语言。
如下图所示,支持其他语言、应用程序编程接口或基于指令的方法,例如 FORTRAN、DirectCompute、OpenACC。
可扩展的编程模型
多核 CPU 和众核 GPU 的出现意味着主流处理器芯片现在是并行系统。挑战在于开发能够透明地扩展可并行的应用软件,来利用不断增加的处理器内核数量。就像 3D 图形应用程序透明地将其并行性扩展到具有广泛不同内核数量的多核 GPU 一样。
CUDA 并行编程模型旨在克服这一挑战,同时为熟悉 C 等标准编程语言的程序员保持较低的学习曲线。
其核心是三个关键抽象——线程组的层次结构、共享内存和屏障同步——它们只是作为最小的语言扩展集向程序员公开。
这些抽象提供了细粒度的数据并行和线程并行,嵌套在粗粒度的数据并行和任务并行中。它们指导程序员将问题划分为可以由线程块并行独立解决的粗略子问题,并将每个子问题划分为可以由块内所有线程并行协作解决的更精细的部分。
这种分解通过允许线程在解决每个子问题时进行协作来保留语言表达能力,同时实现自动可扩展性。实际上,每个线程块都可以在 GPU 内的任何可用multiprocessor上以乱序、并发或顺序调度,以便编译的 CUDA 程序可以在任意数量的多处理器上执行,如下图所示,并且只有运行时系统需要知道物理multiprocessor个数。
这种可扩展的编程模型允许 GPU 架构通过简单地扩展multiprocessor和内存分区的数量来跨越广泛的市场范围:
高性能发烧友 GeForce GPU ,专业的 Quadro 和 Tesla 计算产品 。
注意:GPU 是围绕一系列流式多处理器 (SM: Streaming Multiprocessors) 构建的(有关详细信息,请参阅硬件实现)。 多线程程序被划分为彼此独立执行的线程块,因此具有更多multiprocessor的 GPU 将比具有更少多处理器的 GPU 在更短的时间内完成程序执行。
英伟达GPU硬件架构
在英伟达的设计里,多个核心组成一个Streaming Multiprocessor(SM),一张GPU卡有多个SM。从“Multiprocessor”这个名字上也可以看出SM包含了多个处理器。实际上,英伟达主要以SM为运算和调度的基本单元。
英伟达不同时代产品的芯片设计不同,每代产品背后有一个微架构代号,微架构均以著名的物理学家为名,以向先贤致敬。当前比较火热的架构有:
Ampere 安培2020年5月发布专业显卡:Telsa A100
Turing 图灵2018年发布消费显卡:GeForce RTX 2080 Ti、Titan RTX
Volta 伏特2017年末发布专业显卡:Telsa V100 (16或32GB显存 5120个CUDA核心)
Pascal 帕斯卡2016年发布专业显卡:Telsa P100(12或16GB显存 3584个CUDA核心)
上图为Tesla V100的设计,它共有84个SM。图中密密麻麻的绿色小格子就是GPU计算核心,多个计算核心一起组成了一个SM。将SM放大,单个SM如下图所示。
可以看到一个SM中包含了计算核心、存储等部分:
针对不同类型计算的小核心,包括64位浮点核心(FP64),整型核心(INT),32位浮点核心(FP32),优化深度学习的Tensor Core。
计算核心直接从寄存器(Register)中读写数据。
调度和分发器(Scheduler和Dispatch Unit)。
L0和L1级缓存。
具体而言:
SM中的FP32进行32位浮点加乘运算,INT进行整型加乘运算,SFU(Special Functional Unit)执行一些倒数和三角函数等运算。
这里对Tensor Core做一些简单解释。
Tensor Core是英伟达新的微架构中提出的一种混合精度的计算核心。
我们知道,当前深度神经网络中使用到最频繁的矩阵运算是:D=A×B+CD = A \times B + CD=A×B+C。
Tensor Core可以对4*4的矩阵做上述运算。
其中,涉及乘法的AAA和BBB使用FP16的16位浮点运算,精度较低;涉及加法的CCC和DDD使用FP16或FP32精度。
Tensor Core是在Volta架构开始提出的,使用Volta架构的V100在深度学习上的性能远超Pascal架构的P100。
前面提到的以物理学家命名的名称是英伟达各代GPU的微架构代号,微架构表示英伟达不同时代的芯片设计。不同微架构里各类计算核心和显卡存储的设计不同。2020年,比较流行的微架构为Volta和Turing。
对于消费者而言,英伟达主要有两条产品线:
消费级产品 GeForce 系列:GeForce RTX 2080 Ti ...
针对数据中心的高性能计算产品 Telsa 系列:Telsa V100、Telsa P100、Telsa P40 ...
其中,消费级产品GeForce可以用在个人电脑上,用来加速游戏和视频,Telsa系列产品一般用在数据中心的高性能计算加速场景上。
此外,还有使用在工作站上的Quadro系列,一般用在CAD、视频制作和部分科学计算上,是一个介于GeForce和Telsa之间的产品线。英伟达产品的命名中暗含了微架构:Telsa V100的V表示使用Volta微架构,Telsa P100的P表示使用Pascal微架构;GeForce系列中,20xx系列使用了Turing微架构。
英伟达显卡型号众多,但是归根结底需要关注两方面问题:采用哪种微架构、显卡存储(简称显存)多大。
为什么选择GPU
GPU(Graphics Processing Unit)在相同的价格和功率范围内,比CPU提供更高的指令吞吐量和内存带宽。许多应用程序利用这些更高的能力,在GPU上比在CPU上运行得更快(参见GPU应用程序)。其他计算设备,如FPGA,也非常节能,但提供的编程灵活性要比GPU少得多。
GPU和CPU在功能上的差异是因为它们的设计目标不同。虽然 CPU 旨在以尽可能快的速度执行一系列称为线程的操作,并且可以并行执行数十个这样的线程。但GPU却能并行执行成千上万个(摊销较慢的单线程性能以实现更大的吞吐量)。
GPU 专门用于高度并行计算,因此设计时更多的晶体管用于数据处理,而不是数据缓存和流量控制。
下图显示了 CPU 与 GPU 的芯片资源分布示例:
将更多晶体管用于数据处理,例如浮点计算,有利于高度并行计算。
GPU可以通过计算隐藏内存访问延迟,而不是依靠大数据缓存和复杂的流控制来避免长时间的内存访问延迟,这两者在晶体管方面都是昂贵的。
Reference
GPU加速02:超详细Python Cuda零基础入门教程,没有显卡也能学
anaconda的安装和使用(管理python环境看这一篇就够了)