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. 【参数校验】 自定义校验器 (实现ConstraintValidator)

    日常工作中写接口时,往往需要校验前端传来的枚举状态码,例如"1","2"等等, 这里使用java 303规范的参数校验框架封装一个自定义参数校验器: /** * ...

  2. 【Java注解】@PostConstruct 注解相关

    不多逼逼,直接看注解上面的文档, @PostConsturct PostConstruct注释用于需要执行的方法在依赖注入完成后执行任何初始化.这个方法必须在类投入服务之前调用. 这个所有支持依赖关系 ...

  3. hdu3715 二分+2sat+建图

    题意:       给你一个递归公式,每多一层就多一个限制,问你最多能递归多少层. 思路:      先分析每一层的限制 x[a[i]] + x[b[i]] != c[i],这里面x[] = 0,1, ...

  4. hdu3449 有依赖的背包问题

    题意:       给你一些物品,每个物品有自己的价值和花费,每个物品都对应一个箱子,每个箱子有价钱,买这个物品必须买相应的箱子,给你一个价钱,问最多可以获得多少价值 <提示:多个物品可能同时对 ...

  5. Python中shodan模块的使用

    关于shodan的安装和使用,传送门--> 渗透测试之Shodan的安装和使用 常用 Shodan 库函数 shodan.Shodan(key) :初始化连接API Shodan.count(q ...

  6. Intel汇编程序设计-整数算术指令(中)

    7.3  移位和循环移位的应用 7.3.1  多双字移位 要对扩展精度整数(长整数)进行移位操作,可把它划分为字节数组.字数组或双字数组,然后再对该数组进行移位操作.在内存中存储数字时通常采用的方式是 ...

  7. <input type="file" id="fileID">文本框里的值清空方法

    一般情况下,不允许通过脚本来对文件上传框赋值. 下面是一个变通的方法.就是创建一个新的input type="file" 把原来的替换掉. <!DOCTYPE html PU ...

  8. Git 系列教程(9)- 打标签

    打标签 一般会给提交历史打个标签,方便后续进行筛选.查看 列出标签 可带上可选的 -l 选项 --list $ git tag v1.0 v2.0 这个命令以字母顺序列出标签 可以按照特定的模式查找标 ...

  9. 语音降噪论文“A Hybrid Approach for Speech Enhancement Using MoG Model and Neural Network Phoneme Classifier”的研读

    最近认真的研读了这篇关于降噪的论文.它是一种利用混合模型降噪的方法,即既利用了生成模型(MoG高斯模型),也利用了判别模型(神经网络NN模型).本文根据自己的理解对原理做了梳理. 论文是基于" ...

  10. 在ZOHO企业网盘中如何快速搜索文件?

    现在越来越多的企业采用企业网盘来存储文档和资料,而且现在市面上的企业网盘各种各样.在使用企业网盘过程中,很多用户会问到企业网盘中如何快速搜索文件的问题.但是无论是"标签"功能还是普 ...