【CUDA】(零)前置知识
(零)CUDA前置知识
本人研究生阶段方向为高性能计算,即使做的是国产超算相关内容,CUDA仍是绕不开的一道难关。这也萌生了这个学习笔记,主要希望通过记录的方式督促自己完成CUDA的相关学习。由于写了太多报告,导致习惯性的想先把相关知识介绍一下,学习笔记主要参照书籍《CUDA C编程权威指南》以及相关网络资源。
书籍源代码如下:
https://github.com/lugengyou/cuda_program
本篇笔记参考内容如下:
1 相关知识
1.1 中央处理器CPU
中央处理器(CPU,Central Processing Unit)是一块超大规模的集成电路,是一台计算机的运算核心(Core)和控制核心( Control Unit)。它的功能主要是解释计算机指令以及处理计算机软件中的数据。
核心少(通常几核到几十核),但每个核心非常聪明,频率高,擅长处理复杂的逻辑判断(如果A发生,就做B,否则做C)和串行任务。
在计算中: 它负责读取代码,安排任务,告诉显卡该干什么。
中央处理器主要包括运算器(算术逻辑运算单元,ALU,Arithmetic Logic Unit)和高速缓冲存储器(Cache)及实现它们之间联系的数据(Data)、控制及状态的总线(Bus)。
1.2 显卡 (Graphics Card)
全称显示接口卡,又称显示适配器,是计算机最基本配置、最重要的配件之一。显卡作为电脑主机里的一个重要组成部分,是电脑进行数模信号转换的设备,承担输出显示图形的任务。显卡接在电脑主板上,它将电脑的数字信号转换成模拟信号让显示器显示出来,同时显卡还是有图像处理能力,可协助CPU工作,提高整体的运行速度。
GPU的构成相对简单,有数量众多的计算单元和超长的流水线,特别适合处理大量的类型统一的数据,因此非常适合并行计算。
1.3 内存 (RAM)
内存是计算机中重要的部件之一,它是与CPU进行沟通的桥梁。 存放着操作系统、当前运行的程序以及CPU马上要处理的数据。内存(Memory)也被称为内存储器,其作用是用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据。只要计算机在运行中,CPU就会把需要运算的数据调到内存中进行运算,当运算完成后CPU再将结果传送出来,内存的运行也决定了计算机的稳定运行。
1.4 显存 (VRAM)
GPU 的专属存储空间。速度极快(带宽通常是内存的十倍以上),但容量通常比内存小(比如 12GB, 24GB)。
GPU 只能直接计算显存里的数据。 如果数据在内存里,必须先搬运到显存。
2 CUDA相关概念
CUDA (Compute Unified Device Architecture):NVIDIA推出的并行计算平台和编程模型。
微观层面:指代“硬件” (Hardware)
CUDA可以指显卡内部的物理计算单元。类似于 CPU 的核心(Core),但 CPU 可能只有 8 个核,而一张显卡可能有几千个 CUDA 核。
宏观层面:指“架构” (Architecture)
Compute Unified Device Architecture(统一计算设备架构)。这是一个软硬结合的整体解决方案。它规定了硬件(显卡)应该长什么样才能并行计算,同时也规定了软件(代码)应该怎么写才能指挥这些硬件。
CUDA程序构架分为两部分:Host和Device。一般而言,Host指的是CPU,Device指的是GPU。在CUDA程序构架中,主程序还是由CPU来执行,而当遇到数据并行处理的部分,CUDA 就会将程序编译成GPU能执行的程序,并传送到GPU。而这个程序在CUDA里称做核(kernel)。
2.1 CUDA Toolkit
在安装CUDA时,安装的是CUDA Toolkit (工具包),开发CUDA程序所需的软件开发包(SDK)。包含了编译器: NVCC;库: 数学库(cuBLAS, cuFFT等);调试与分析工具: Nsight, Visual Profiler等,
想要写或者编译一个需要调用GPU的代码,必须安装CUDA Toolkit。也就是说仅仅安装显卡驱动(Driver)只能你运行编译好的程序,要开发则需要Toolkit。
2.2 NVCC
CUDA的编译器驱动程序,作用:将你代码(.cu 文件)进行分离:
- 把在CPU上跑的代码交给系统的C++编译器(如gcc, cl.exe)。
- 把在GPU上跑的代码(Kernel)由它自己编译成PTX或二进制代码。
2.3 cuDNN
cuDNN是专门为深度学习设计的GPU加速库。针对深度学习中常见的操作(如卷积、池化、归一化、激活函数)进行了极致的底层优化。cuDNN 依赖于 CUDA Toolkit。



