首页 > 编程语言 >CUDA编程学习 (4)——thread执行效率

CUDA编程学习 (4)——thread执行效率

时间:2024-10-27 22:42:56浏览次数:1  
标签:控制 thread 编程 warp WIDTH CUDA 分歧 block

1. Warp 和 SIMD 硬件

1.1 作为调度单位的 Warp

image-20240923234624137

每个 block 分为 32-thread warp

  • 在 CUDA 编程模型中,虽然 warp 不是显式编程的一部分,但在硬件实现上,每个 block 会被自动划分成若干个包含 32 个线程的 warp。

  • warp 作为 SM 中的调度单元:SM(Streaming Multiprocessor)会以 warp 为单位进行调度和管理,这意味着在执行时,每次会选择一个 warp 中的 thread 来运行。

  • warp 中的线程以 SIMD 方式执行:SIMD(Single Instruction Multiple Data)是一种并行计算方式,表示一个 warp 中的所有 thread 会同时执行相同的指令,但可以处理不同的数据。

  • thread 数量未来可能变化:当前的 warp 包含 32 个 thread,但在未来的硬件架构中,warp 中的 thread 数量可能会有所改变。

1.2 多维 thread block 中的 warp

首先将 thread block 按行主次线性化为 1D

  • 首先是 x 维,其次是 y 维,最后是 z 维,\(T_{row,col}=T_{y,x}\)
image-20240924002010524

1.3 Block 在线性化后被分区

线性化 block 的划分:

  • thread 索引在 warp 中是连续且递增的
  • warp 0 从 thread 0 开始

分区方案在不同 device 上是一致的:

  • 在不同的 CUDA device 上,warp 的分区方式是相同的,因此可以在控制流中利用这一点进行编程。
  • 但是,warp 的确切大小可能会随代际变化:虽然当前 warp 通常包含 32 个 thread,但未来的硬件可能会改变这个大小。

不要依赖 warp 内或 warp 之间的执行顺序:

  • CUDA 程序不能依赖 warp 内部或不同 warp 之间的执行顺序,因为 thread 的执行顺序并没有严格的保证。
  • 如果 thread 之间存在依赖性,需要使用 __syncthreads() 进行同步:当某些 thread 的结果会影响其他 thread 时,必须显式使用同步函数 __syncthreads(),否则可能会得到错误的结果。

1.4 SMs 是 SIMD(单指令多数据流)处理器

指令获取、解码和控制的控制单元在多个处理单元之间共享

  • 控制开销被最小化(模块1)
image-20240924004151289

1.5 warp thread 间的 SIMD 执行

warp 中的所有 thread 在任何时间点都必须执行相同的指令

如果所有 thread 都遵循相同的控制流路径,这种方法就能高效运行

  • 所有 if-then-else 语句都做出相同的决定
  • 所有循环的遍历次数相同

1.6 控制分歧

当同一个 warp 中的 thread 由于做出不同的控制决策而走上不同的控制流路径时,就会发生控制分歧。

  • 比如在一个 if 语句中,一些 thread 选择走 then 路径,而另一些线程选择走 else 路径。
  • 或者一些 thread 执行循环的次数比其他 thread 多。

当前 GPU 中,warp 中的 thread 如果选择了不同的控制路径,选择不同路径的 thread 会被串行化执行。

  • GPU会依次执行每个控制路径,在执行某个路径时,所有选择该路径的线程会并行执行,而没有选择该路径的线程则会暂停(即这些线程不参与当前路径的执行)。
  • 当涉及嵌套控制流语句(如嵌套的if-else或循环)时,控制分歧的复杂性会增加,不同路径的数量也会变得非常大,进一步增加了执行的开销。

1.6.1 控制分歧示例

当分支或循环条件依赖于 thread 索引时,可能会产生分歧。

具有分歧的示例 kernel 语句:

  • if (threadIdx.x > 2) {}
  • 这为一个 block 中的 thread 创建了两条不同的控制路径
  • 决策粒度 < warp的大小;thread 0、1 和 2 与第一个 warp 中的其余 thread 遵循不同的路径

没有分歧的示例:

  • if (blockIdx.x > 2) {}

  • 决策粒度 = block 的大小的倍数;在任何一个 warp 中的所有 thread 都会遵循相同的路径

1.7 示例:向量加法 kernel

// Device Code
// Compute vector sum C = A + B
// Each thread performs one pair-wise addition
__global__
void vecAddKernel(float* A, float* B, float* C, int n)
{
	int i = threadIdx.x + blockDim.x * blockIdx.x;
	if(i < n) C[i] = A[i] + B[i];
}

1.7.1 对 1000 个元素的向量大小进行分析

  • 假设 block 大小为 256 个 thread

    • 每个 block 有 8 个 warp
  • block 0、1 和 2 中的所有 thread 都在有效范围内

    • i 值从 0 到 767

    • 这三个 block 中的 24 个 warp 都不会有控制分歧

  • block 3 中的大多数 warp 不会有控制分歧

    • warp 0-6 中的 thread 都在有效范围内,因此没有控制分歧
  • block 3 中的一个 warp 会有控制分歧

    • thread 的 i 值从 992 到 999 都在有效范围内

    • thread 的 i 值从 1000 到 1023 将超出有效范围

  • 控制分歧导致的串行化效果很小

    • 32 个 warp 中只有 1 个有控制分歧

    • 对性能的影响可能小于 3%

2. 控制分歧对性能的影响

2.1 控制分歧对性能的影响

  • 边界条件检查对并行代码的完整功能和稳健性至关重要
    • tiled 矩阵乘法 kernel 有许多边界条件检查
    • 令人担忧的是,这些检查可能会导致性能严重下降

例如,请看下面的 tile 加载代码:

if(Row < WIDTH && p * TILE_WIDTH + tx < WIDTH) {
    ds_M[ty][tx] = M[Row * WIDTH + p * TILE_WIDTH + tx];
} else {
    ds_M[ty][tx] = 0.0;
}

if(p * TILE_WIDTH + ty < WIDTH && Col < WIDTH) {
    ds_N[ty][tx] = N[(p * TILE_WIDTH + ty) * WIDTH + Col];
} else {
    ds_N[ty][tx] = 0.0;
}

2.2 装载 M tiles 的两种 blocks

  • Type 1:直到最后阶段,所有 tile 都在有效区域的 block
  • Type 2:部分 tile 一直在有效范围之外的 block
image-20240925112502377

2.3 控制分歧影响分析

  • 假设有 \(16\times 16\) tiles 和 thread blocks
  • 每个 thread blocks 有 8 个 warps(\(256/32\))
  • 假设有一个 \(100\times100\) 正方形矩阵
  • 每个 thread 将经历 7 个阶段(\(100/16\) 的上限,因为 tiles 为 \(16 \times 16\))
  • 共有 49 个 thread blocks(每个维度 7 个)

2.3.1 加载 M tiles 时的控制分歧

  • 现在共有 42(\(6\times7\))个 Type 1 blocks,共 336(\(8\times42\))个 warps

  • 它们都有 7 个阶段,因此共有 2,352 (\(336\times7\)) 个 warp-phases

  • warps 只有在最后阶段才有控制分歧

  • 因此有 336 个 warp-phases 存在控制分歧

image-20240925130319446

2.3.2 加载 M tiles 时的控制分歧(Type 2)

  • Type 2:分配给载入底层 tiles 的 7 个 block,共有 56(\(8\times7\))个 warps
  • 它们都有 7 个阶段,因此共有 392(\(56\times7\)) 个 warp-phases
  • 每个 Type 2 block 中有两个 warp 处于 valid range 的边界,包涵控制分歧
  • 其余 6 个 warp 不在有效范围内
  • 因此,只有 14(\(2\times7\))warp-phases 有控制分歧
image-20240925131139545

2.3.3 控制分歧的总体影响

  • Type 1 Blocks:2,352 个 warp-phases 中有 336 个存在控制分歧
  • Type 2 Blocks:392 个 warp-phases 中有 14 个存在控制分歧
  • 对性能的影响预计低于 \(12\%\)(\(350/2,944\) 或 \((336+14)/(2352+14)\))

2.3.4 补充

  • 计算 N tiles 加载控制分歧的影响略有不同(自行计算)
  • 估计的性能影响取决于数据
    • 对于较大的矩阵,影响会小得多
  • 一般来说,控制分歧对大型输入数据集的边界条件检查影响不大
    • 应毫不犹豫地使用边界检查,以确保充分发挥功能
  • kernel 充满控制流结构并不意味着会出现大量控制分歧
  • 我们将在 "并行算法模式" 模块中介绍一些自然会导致控制分歧的算法模式(如并行缩减)

标签:控制,thread,编程,warp,WIDTH,CUDA,分歧,block
From: https://www.cnblogs.com/Astron-fjh/p/18509179

相关文章

  • java计算机毕业设计基于web的青少年编程课程评价系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着信息技术的迅猛发展,编程教育在青少年教育中的地位日益凸显。如今,编程被视为一项关键技能,对青少年的逻辑思维、创造力和问题解决能力有着积极......
  • JAVA 面向对象编程
    随着软件系统的复杂性不断增加,传统的过程式编程方法已经难以满足需求。面向对象编程提供了一种更自然的方式来映射现实世界的问题域到计算机程序中,使得代码更加易于理解、维护和扩展。面向对象编程(Object-OrientedProgramming,OOP)是一种编程范式,它使用“对象”来设计软件和实......
  • C++ 模板编程:解锁高效编程的神秘密码
     快来参与讨论......
  • 【MySQL】实战篇—应用开发:使用MySQL与编程语言(如Python、Java、PHP等)进行交互
    MySQL是存储和管理数据的强大工具,而编程语言(如Python、Java、PHP等)则用于开发应用程序和处理业务逻辑。将这两者结合起来,可以实现数据的存储、查询、更新和管理,进而构建功能强大的应用程序。2.重要性和实际应用场景在软件开发中,数据库与编程语言的交互至关重要,以下是一些常......
  • PLC 编程和 IIOT 工业物联网的区别是什么
    PLC编程和IIOT工业物联网的区别:1.技术定义和应用范围;2.功能特性对比;3.系统架构差异;4.数据处理方式;5.未来发展趋势。PLC主要负责现场控制和设备直接管理,而IIOT则担负着将设备数据互联互通、优化整体生产流程的任务。1.技术定义和应用范围PLC编程:是指利用一种专门的编程......
  • 实验2 类和对象_基础编程
    1.实验任务一:t.h:#pragmaonce#include<string>//类T:声明classT{//对象属性、方法public:T(intx=0,inty=0);//普通构造函数T(constT&t);//复制构造函数T(T&&t);//移动构造函数~T();//析构函数vo......
  • 阅读笔记一:《代码大全2》的宏观视角与编程艺术
    《代码大全2》是一部编程领域的经典之作,它不仅是一部技术指南,更是一部关于编程艺术的深刻探讨。在阅读这本书的过程中,我首先被其宏观的视角所吸引。作者并没有局限于某一种编程语言或技术框架,而是从更广泛的角度探讨了编程的基本原则、最佳实践和常见问题。书中强调了代码的可读性......
  • 【英特尔IA-32架构软件开发者开发手册第3卷:系统编程指南】2001年版翻译,2-2
    文件下载与邀请翻译者学习英特尔开发手册,最好手里这个手册文件。原版是PDF文件。点击下方链接了解下载方法。讲解下载英特尔开发手册的文章翻译英特尔开发手册,会是一件耗时费力的工作。如果有愿意和我一起来做这件事的,那么,欢迎你的加入。另外,我不仅仅是打算翻译这一种手册,......
  • 【英特尔IA-32架构软件开发者开发手册第3卷:系统编程指南】2001年版翻译,2-3
    文件下载与邀请翻译者学习英特尔开发手册,最好手里这个手册文件。原版是PDF文件。点击下方链接了解下载方法。讲解下载英特尔开发手册的文章翻译英特尔开发手册,会是一件耗时费力的工作。如果有愿意和我一起来做这件事的,那么,欢迎你的加入。另外,我不仅仅是打算翻译这一种手册,......
  • 小白用这个AI工具也可以躺赢,这个也是我比较喜欢的AI编程工具!
    给你分享一个免费的智能编程助手。https://www.marscode.cn/events/s/iSQJSTtK/咱们先看下这个工具的功能和效果:MarsCode是一款由豆包公司开发的AI编程助手,它具备以下优点:1.**智能代码补全**:MarsCode能够提供单行或多行的代码推荐,并支持通过注释生成代码片段,提升代......