Jianghc's Blog

Back

导论 (20230223)#

并发与并行 并发是多个线程处理多个事情,每个线程处理一个事情。并行是多个线程处理一个任务。

课程内容#

内容体系

  1. GPU体系架构知识
  2. CUDA基础编程知识
  3. CUDA调试与优化
  4. GPU并行算法
  5. 信号/图像处理
  6. 最新NVIDIA GPU和CUDA特性
  7. NCCL/MPI 与多GPU编程(多卡的情况)

上机实验:

  • 任意尺寸矩阵相乘,shared memory
  • 矩阵转置 shared memory 无 conflict
  • 编程模型(Programming Model)也称为线程组织模型.
  • Optimization (compute bound, memory bound;Little‘s law),让CPU的核心保持busy的状态
  • 调试工具,CUDA-GDB,Nisight(内存分析工具)

课程资源:

  • NVIDIA CUDA Zone
  • CUDA C Programming Guide, NVIDIA Corp
  • CUDA Best Practice Guide, NVIDIA Corp
  • 延迟优化,指令优化(最后一步)

CPU与GPU体系架构#

CPU体系结构

  • pipeline:取指,译指,执行,写入(Fetch->Decode->Execute->Memory->Write back)
  • Branch Prediction 分支预测,if-else
  • Superscalar 超标量,一个核复制三份
  • Out-of-Order(OoO) Execution 乱序执行,有些指令是相互独立的
  • Memory Hierarchy
  • Vector Operation 向量操作,协处理器
  • Multi-Core 多核,频率提高会导致散热难以控制

CPU的核也可以称为累加器,主要是做加法。南桥主要针对慢速设备,北桥现在已经做到CPU里面了。做计算主要是从寄存器中读数据

CPI(Cycles Per Instruction。每条指令所耗的时钟周期)&Clock Cycle,两者有平衡点,不能一个劲的提升。GPU主要提升的计算指令部分的时间(Vector instructions),这部分占比比较小的话是不太有优化空间的。

CPU的len数决定了pcie的卡槽的数目(全速跑16,半速则为8),有效的传输速率大概在80%。PCIE 64G,分为上下行,各32G。

L3 cache所有核心共享(高速缓存),L2和L1是每个核心内独有的,

指令集并行,指令集越长,吞吐量越大,则带来的性能惩罚也越大(当分支预测错误的时候)Alleged Pipeline Lengths

分支断定(Branch Predication),把if和else的操作都做了,根据要求来进行对应的输出。这里是GPU采用的方式。GPU中要避免分支发散的情况,即做了if又做了else。最后的时间大于两者之和

IPC Boost,每个时钟周期做多少条指令(多核),引入超标量概念,Superscalar, increase pipeline width,增加了核数。

RAW(read-after-write,写后读),寄存器重命名(replace register),指令重排,可以做到指令集并行,可以提高吞吐量。Reorder Buffer,OoO器件会增加执行的效率。

Cache(SRAM),把相近的数据,空间相关性比较强的,一次性取过来多少字节(cache line)。先从L2缓存中取,再从L3中取,最后再到内存中取,内存和I/O数据进行交互。从缓存中找到了数据cache hate,没找到cache miss。

Hardware management

  • L1 instruction / Data caches 特殊指令
  • L2 unified cache
  • L3 unified cache

CPU Parallelism

  • Instruction-Level(ILP) extraction
  • Data-Level Parallelism (DLP)
  • Thread-Level Parallelism (TLP) 数据集并行需要借助协处理器

Multicore make a complete copy of the pipeline

Lesson 2----GPU的架构 (20230302)#

复习:存储器,发热

Parallel Data Processing CPU采用指令集并行的方式,在当前时刻实际上只有一个任务运行(时间片轮转算法)。多核CPU可以进行真正的并行运算。

  • SISD:单指令,单数据。这个可能现在见到的少了
  • SIMD:协处理器,单指令,多数据。 !常见
  • MISD:多指令,单数据,(对同一个数据进行多指令的处理)
  • MIMD:多指令,多数据。(多核CPU)

一些名词:

  • Serial Execution 串行执行。
  • Parallel Execution 并行执行
  • Synchronization 同步
  • Granularity
  • Scalability 可扩展性

三大总线:地址总线,控制总线,数据总线

  • OpenMP主要针对多线程,通过指示性语句自动生成并行代码(主要是以#开头),这种是一种自动并行的方式。
  • MPI,跨节点进行管理。
  • SPMD (single Program Multiple Data)

Design of parallel programs and systems

  • understand problem and procedures 求解问题空间进行切分,利用多核来处理该程序
  • Block segmentation 数据块分割,section进行并行?
  • Communication
  • Synchronization
  • Data dependence,考虑数据之间的依赖关系,有依赖关系的可能没办法进行并行。
  • Load balancing
  • Granularity
  • I/O
  • Costs
  • Performance analysis and optimizaiotn 寻找最耗时的部分(通常通过一些性能分析软件)

线程共享同一个进程的空间,这里的通信主要考虑的是进程,reduction,归约。

Amdahl‘s Law 如果有N个处理器,并行部分占比是P,串行部分占比是S,上限的加速比是1/S。实现的代码的部分不是无休止的加速,有这个比例去控制。串行时间和并行时间可以分别计算。 speedup=1P/N+Sspeedup = \frac{1}{P/N+S}

Graphic Processing Unit(GPU)outline 图1 右侧的主要是为了降低延迟,低延迟是他的特点,在GPU部分会把这个部分精简。 指令流共享:SIMD

  • 第一个idea:将逻辑功能单元砍掉
  • 第二个idea:增加ALU,指令流是一样的,每个ALU处理不同的数据,SIMD processing
  • 第三个idea:通过片源切换,来实现延迟隐藏,从而实现更高的吞吐量。

GPU分支断定,CPU分支预测,nvidiaGPU是标量的GPU,向量化通过硬件去实现。 Hiding shader stalls:通过片源切换,可以将stall延迟的现象隐藏。从而提高吞吐量。执行上下文是我们可以控制的。

GPU的SM(streaming multiprocessor 流处理单元)相当于CPU中的一个核心。Tensor core是做矩阵乘法用的,主要是解决深度学习中的卷积乘法。对于专业的计算卡会有FP64核。FP32,和FP64称为cuda核。

ratio of instruction(用于衡量是否到位了):peak single precision flops / peak memory bandwidth。对于3090显卡来说,一个block块最多可以配置1024个线程,grid是指块的维度。

ALU在GPU中被定义一个CUDA core,每个SM对于3090有128个CUDA core,每个warp 对应于 fetch decode。

带宽受限在GPU中是个很重要的问题,第一个手段:减少带宽的需求(尽量少访问数据),第二个手段:对于重用的数据可以放在高带宽的存储器上。GPU可以看成是异构多核的处理器。线程是软件的概念,需要通过硬件的核心来承载

Lesson 3----CUDA编程模型 (20230309)#

grid求解时要考虑多分配一点空间,之后通过N来保证访问位置的边界。 排队上的线程块是串行的,线程块之间彼此独立执行。block由core绑定,则只能在当前SM上运行。

块内的线程可以通过shared memory进行通信,

矩阵相乘 c通常是行优先,对于python来说是行优先。不论是二维和三维,注意对于内存中的存储都是连续的一条线。

Lesson 5----CUDA编程模型 (20230330)#

CPU演化

  • 第一步精简
  • 第二步添加ALU
  • 第三步片源切换,延迟隐藏

对于二级缓存L2(off chip),以segment为单位,32bit,一次传输 对于一级缓存L1(on chip),cache line,128bit,一次性传输

尽可能满足合并访存。

ECC校验只存在计算卡当中,而游戏卡中不存在,如果内存颗粒有坏块的话可以进行校验。

device query

复旦课程---CUDA编程与并行化
https://525511.xyz/blog/%E5%A4%8D%E6%97%A6%E8%AF%BE%E7%A8%8B-cuda%E7%BC%96%E7%A8%8B%E4%B8%8E%E5%B9%B6%E8%A1%8C%E5%8C%96
Author Haochen Jiang
Published at February 23, 2023
Comment seems to stuck. Try to refresh?✨