(零)CUDA前置知识

本人研究生阶段方向为高性能计算,即使做的是国产超算相关内容,CUDA仍是绕不开的一道难关。这也萌生了这个学习笔记,主要希望通过记录的方式督促自己完成CUDA的相关学习。由于写了太多报告,导致习惯性的想先把相关知识介绍一下,学习笔记主要参照书籍《CUDA C编程权威指南》以及相关网络资源。

书籍源代码如下:
https://github.com/lugengyou/cuda_program

本篇笔记参考内容如下:

https://blog.csdn.net/xue_csdn/article/details/105297919?ops_request_misc=&request_id=&biz_id=102&utm_term=cuda%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86%E4%BB%8B%E7%BB%8D&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-105297919.142

https://blog.csdn.net/cyhbrilliant/article/details/79434090?ops_request_misc=&request_id=&biz_id=102&utm_term=cuda&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-1-79434090.142

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程序构架分为两部分:HostDevice。一般而言,Host指的是CPUDevice指的是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。