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. 文档翻译第001篇:Process Monitor帮助文档(Part 1)

    [译者注] Process Monitor是一款非常著名的系统进程监视软件.总体来说,Process Monitor相当于Filemon+Regmon,其中的Filemon专门用来监视系统中所有文件的 ...

  2. PAT 乙级 -- 1002 -- 写出这个数

    题目: 读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字. 输入格式:每个测试输入包含1个测试用例,即给出自然数n的值.这里保证n小于10100. 输出格式:在一行内输出n的各位数字 ...

  3. Iptables防火墙实验

    先说明一下环境,这里有四台主机,中间的Centos充当防火墙.右上角的win XP和右下角的Rhel7充当服务器,最左边的win7充当主机.四者之间的网卡都已经配置好.而且我们已经在Centos6.5 ...

  4. apk 脱壳

    在理解android的类加载后,我们可以愉快对apk来脱壳了.脱壳重要的是断点: 断点:在哪个位置脱壳,这里着重指的是在哪个方法 先介绍断点,我们只要知道加壳是用哪个方法来加载dex的,hook这个方 ...

  5. Python脚本暴力破解SSH口令以及构建僵尸网络(pxssh)

    目录 暴力破解SSH口令 SSH远端执行命令 构建僵尸网络 环境:Kali Linux  python 2.7.13 暴力破解SSH口令 Pxssh是pexpect库的ssh专用脚本,他能用预先写好的 ...

  6. [CTF]ACSII码

    [CTF]ACSII码 ----------转自百度百科 https://baike.baidu.com/item/ASCII/309296?fromtitle=ascii码&fromid=9 ...

  7. java.lang.NoSuchMethodError: org.springframework.util.Assert.state(ZLjava/util/function/Supplier;)V

    更多精彩见微信公众号 at org.springframework.test.context.support.AbstractTestContextBootstrapper.buildMergedCo ...

  8. Linux系统运行netstat命令时的过三关斩一将

    1.简介 这篇文章主要是记录在日常工作中遇到的一些问题,将其都总结整合到一起,方便查看,提高工作效率.小伙伴们看到标题可能觉得奇怪,不是过五关斩六将而是过三关斩一将.慢慢地往后看发现其中奥秘. 2.过 ...

  9. JavaWeb——JDBC连接池&JDBCTemplate

    今日内容 1. 数据库连接池 2. Spring JDBC : JDBC Template 数据库连接池 1. 概念:其实就是一个容器(集合),存放数据库连接的容器. 当系统初始化好后,容器被创建,容 ...

  10. Visual Lab Online —— Beta版本发布声明

    项目 内容 班级:北航2020春软件工程 博客园班级博客 作业:Beta阶段发布声明 发布声明 目录 发布方式.发布地址与运行环境要求 软件主体 浏览器扩展 Beta版本新功能 登录注册页 注册时邮箱 ...