GPU编程和流式多处理器(五)

4. 条件代码

硬件实现了“条件代码”或CC寄存器,其中包含用于整数比较的常用4位状态向量(符号,进位,零,溢出)。可以使用比较指令(例如ISET)来设置这些CC寄存器,并且它们可以通过谓词或发散来指导执行流程。预测允许(或禁止)在warp内基于每个线程执行指令,而分歧则是较长指令序列的条件执行。因为SM内的处理器以warp粒度(一次32个线程)以SIMD方式执行指令,所以如果warp内的所有线程都采用相同的代码路径,则差异会导致执行的指令更少。

4.1. 谓词

由于管理发散和收敛的额外开销,编译器对短指令序列使用了谓词。多数指令的效果可以根据条件确定。如果条件不为TRUE,则禁止该指令。这种抑制发生得足够早,以至于预先确定的指令执行(例如加载/存储)和TEX会抑制该指令原本会生成的内存流量。请注意,谓词对内存流量是否适合全局加载/存储合并没有影响。在warp中为所有加载/存储指令指定的地址,必须引用连续的存储位置,即使它们是有条件的。

当根据条件而变化的指令数量较少时,可以使用谓词。编译器使用的启发式方法,支持最多7条指令的谓词。除了避免如下所述的管理分支同步堆栈的开销外,谓词在发出微代码时还为编译器提供了更多的优化机会(例如指令调度)。C (? :)中的三元运算符,被视为有利于谓词的编译器提示。

清单2提供了一个很好的谓词示例,以微码表示。在共享内存位置执行原子操作时,编译器将发出在共享内存位置循环的代码,直到成功执行原子操作为止。所述LDSLK(负载共享和锁定)指令返回一个条件码,判断锁是否被获取。然后根据该条件代码确定执行操作的指令。

/ * 0058 * / LDSLK P0,R2,[R3];
/ * 0060 * / @ P0 IADD R2,R2,R0;
/ * 0068 * / @ P0 STSUL [R3],R2;
/ * 0070 * / @!P0 BRA 0x58;

该代码片段还强调了,谓词和分支如何协同工作。确定了最后一条指令,即在必要时尝试重新获取锁的条件分支。

4.2. 发散与收敛

谓词适用于条件代码的小片段,尤其是在没有相应else的语句中。对于大量的条件代码,由于每条指令都会执行,不管是否会影响计算,谓词的效率都会降低。当大量指令导致预测成本超过收益时,编译器将使用条件分支。当warp中的执行流程,根据条件采用不同的路径时,该代码称为divergent。

NVIDIA对其硬件如何支持不同的代码路径的细节一无所知,并且保留在两代之间更改硬件实现的权利。硬件在每个warp中维护活动线程的位向量。对于标记为非活动的线程,以类似于谓词的方式抑制执行。在执行分支之前,编译器执行一条特殊指令,将该活动线程位向量压入堆栈。然后,该代码执行两次,一次是针对条件为TRUE的线程,另外是谓词为FALSE的线程。如Lindholm等人所述,此两阶段执行由分支同步堆栈管理。15

  • 如果warp的线程通过依赖于数据的条件分支发散,则warp会串行执行所采用的每个分支路径,从而禁用不在该路径上的线程,并且当所有路径完成时,这些线程将重新收敛到原始执行路径。SM使用分支同步堆栈,来管理发散和收敛的独立线程。分支发散仅在warp内发生;不管执行的是通用,还是不相交的代码路径,不同的warp都将独立执行。

PTX规范没有提及分支同步堆栈,公开存在的唯一证据是cuobjdump的反汇编输出。SSY指令推的状态下,如程序计数器和活动线程掩模压入堆栈; 该.S指令前缀突然发出这样的状态,如果任何活动线程没有采取分支,使这些线程执行的代码路径,其状态是由快照SSY。

仅当执行线程可能分歧时,才需要SSY / .S。如果编译器可以保证线程在代码路径中保持一致,会出现SSY / .S不在括号内的分支。关于在CUDA中进行分支,在所有情况下,warp中的所有线程遵循相同的执行路径是最有效的。

清单2中的循环,包括一个很好的独立实例,说明了差异和收敛。所述SSY指令(偏移0x40的)和NOP.S指令(偏移0x78)分别括号发散和会聚的点。代码遍历LDSLK和随后的谓词指令,退出活动线程,直到编译器发现所有线程都将收敛,并且可以使用NOP.S指令,退出分支同步堆栈。

/ * 0040 * / SSY 0x80;
/ * 0048 * / BAR.RED.POPC RZ,RZ;
/ * 0050 * / LD R0,[R0];
/ * 0058 * / LDSLK P0,R2,[R3];
/ * 0060 * / @ P0 IADD R2,R2,R0;
/ * 0068 * / @ P0 STSUL [R3],R2;
/ * 0070 * / @!P0 BRA 0x58;
/ * 0078 * / NOP.S CC.T;

4.3. 特殊情况:最小值,最大值和绝对值

一些条件操作是如此普遍,以至于硬件会对其本身提供支持。整数和浮点算子均支持最小和最大运算,并将它们转换为单个指令。此外,浮点指令包括,否定或取源算子的绝对值的修饰符。

编译器可以很好地检测何时,表达了最小/最大运算,但是如果不希望碰碰运气,请为整数调用min()/ max()内部函数,或者为float调用fmin()/ fmax()价值观。

GPU编程和流式多处理器(五)的更多相关文章

  1. GPU编程和流式多处理器(六)

    GPU编程和流式多处理器(六) 5. 纹理和表面 读取和写入纹理和表面的指令,所引用的隐式状态,比其他指令要多得多.header中包含诸如基地址,尺寸,格式和纹理内容的解释之类的参数,该header是 ...

  2. GPU编程和流式多处理器(四)

    GPU编程和流式多处理器(四) 3.2. 单精度(32位) 单精度浮点支持是GPU计算的主力军.GPU已经过优化,可以在此数据类型上原生提供高性能,不仅适用于核心标准IEEE操作(例如加法和乘法),还 ...

  3. GPU编程和流式多处理器(三)

    GPU编程和流式多处理器(三) 3. Floating-Point Support 快速的本机浮点硬件是GPU的存在理由,并且在许多方面,它们在浮点实现方面都等于或优于CPU.全速支持异常可以根据每条 ...

  4. GPU编程和流式多处理器(二)

    GPU编程和流式多处理器(二) 2. 整数支持 SM具有32位整数运算的完整补充. 加法运算符的可选否定加法 乘法与乘法加法 整数除法 逻辑运算 条件码操作 to/from浮点转换 其它操作(例如,S ...

  5. GPU编程和流式多处理器

    GPU编程和流式多处理器 流式多处理器(SM)是运行CUDA内核的GPU的一部分.本章重点介绍SM的指令集功能. 流式多处理器(SM)是运行我们的CUDA内核的GPU的一部分.每个SM包含以下内容. ...

  6. GPU编程和流式多处理器(七)

    6. 杂项说明 6.1. warp级原语 warp作为执行的原始单元(自然位于线程和块之间),重要性对CUDA程序员显而易见.从SM 1.x开始,NVIDIA开始添加专门针对thread的指令. Vo ...

  7. GPU 编程入门到精通(五)之 GPU 程序优化进阶

    博主因为工作其中的须要,開始学习 GPU 上面的编程,主要涉及到的是基于 GPU 的深度学习方面的知识.鉴于之前没有接触过 GPU 编程.因此在这里特地学习一下 GPU 上面的编程. 有志同道合的小伙 ...

  8. GPU 编程入门到精通(四)之 GPU 程序优化

    博主因为工作其中的须要,開始学习 GPU 上面的编程,主要涉及到的是基于 GPU 的深度学习方面的知识,鉴于之前没有接触过 GPU 编程.因此在这里特地学习一下 GPU 上面的编程.有志同道合的小伙伴 ...

  9. GPU 编程入门到精通(三)之 第一个 GPU 程序

    博主因为工作其中的须要.開始学习 GPU 上面的编程,主要涉及到的是基于 GPU 的深度学习方面的知识,鉴于之前没有接触过 GPU 编程,因此在这里特地学习一下 GPU 上面的编程.有志同道合的小伙伴 ...

随机推荐

  1. The 2014 ACM-ICPC Asia Mudanjiang Regional First Round A

    网选A,水题: 这个是水题,只要枚举一遍,看有多少a[i-1]<a[i]>a[i+1],不解释了.

  2. 【转】浅谈自动特征构造工具Featuretools

    转自https://www.cnblogs.com/dogecheng/p/12659605.html 简介 特征工程在机器学习中具有重要意义,但是通过手动创造特征是一个缓慢且艰巨的过程.Python ...

  3. CCNA 第四章 轻松划分子网

    1:划分子网的的好处: (1):减少网络流量 (2):优化网络性能 (3):简化管理 (4):有助于覆盖大型地理区域 2:CIDR和ISP的概念 (1):CIDR:Classless Inter-Do ...

  4. 用户对象/GDI对象/内核对象

    对象的分类 Windows的对象可以分为三种,分别是用户对象,GDI对象和内核对象.系统使用用户对象支持窗口管理,使用GDI对象支持图形,并使用内核对象支持内存管理,进程执行和进程间通信(IPC) . ...

  5. [刷题] 435 Non-overlapping Intervals

    要求 贪心算法与动态规划的关系 给定一组区间,最少删除多少个区间,可以让这些区间之间互相不重叠 给定区间的起始点永远小于终止点 示例 [[1,2],[2,3],[3,4],[1,3]], 返回1 [[ ...

  6. 【转载】linux 设备管理器 图形hardinfo 字符 lshw lspci

    在ubuntu中怎样启动类似windows中的 设备管理器 sudo apt-get install hardinfo lspci sudo lshw everestubuntu下的"设备管 ...

  7. [转载]有些shell文件中为啥要用$(cd “$(dirname $0)“; pwd),pwd它不香吗

    $(cd "$(dirname "$0")",pwd) 解析   xx.sh 文件内容如下: #!/bin/bash BIN_FOLDER=$(cd " ...

  8. 《SystemVerilog验证-测试平台编写指南》学习 - 第1章 验证导论

    <SystemVerilog验证-测试平台编写指南>学习 - 第1章 验证导论 测试平台(testbench)的功能 方法学基础 1. 受约束的随机激励 2. 功能覆盖率 3. 分层的测试 ...

  9. Linux创建RAID5_实战

    Linux创建RAID5实战 Linux创建RAID5 RAID5最少由三个硬盘组成,它将数据分散存储于阵列中的每个硬盘,并且还伴有一个数据校验位,数据位与校验位通过算法能相互验证 RAID5最多能允 ...

  10. BUUCTF(十)[GXYCTF2019]Ping Ping Ping 1

    BUUCTF系列 /?ip=baidu.com /?ip=baidu.com|ls 正常回显,当cat flag.php时,提示不让输入空格,而且后面还不让出现falg字符 IFS IFS (Inte ...