GPU编程和流式多处理器(七)
6. 杂项说明
6.1. warp级原语
warp作为执行的原始单元(自然位于线程和块之间),重要性对CUDA程序员显而易见。从SM 1.x开始,NVIDIA开始添加专门针对thread的指令。
Vote
CUDA体系结构是32位的,并且warp由32个线程组成,这些线程与评估条件,向warp中的每个线程广播1位结果,指令能完整匹配。VOTE指令(在SM 1.2第一个可用的)的计算结果的状态,并广播该结果在thread的所有线程。__any()默认返回1,在任何thread32个的线程,如果断言为真。__all()默认返回1,如果谓词是真正的,所有的thread32个的线程。
Fermi体系结构添加了VOTE的新变体,可将thread中每个线程的谓词结果传回。__ballot()默认全部线程的状态,并返回一个32位的值,每个比特给出了相应的线程的状态。
Shuffle随机播放
开普勒(Kepler)添加了随机播放指令,可以使内部线程之间进行数据交换,而无需通过共享内存暂存数据。尽管这些指令以与共享内存,有相同的等待执行时间,好处是,无需执行读和写操作,即可进行交换,并且可以减少共享内存的使用。
以下指令包含在许多使用sm_30_intrinsics.h中定义的,嵌入式PTX程序集的设备功能中。
int __shfl(int var,int srcLane,int width = 32);
int __shfl_up(int var,unsigned int delta,int width = 32);
int __shfl_down(int var,unsigned int delta,int width = 32);
int __shfl_xor(int var,int laneMask,int width = 32);
宽度参数,缺省值为32的宽度,必须是2的幂的范围内2..32。它可以将 warp细分为多个部分;如果width <32,则warp的每个子部分,都将充当一个单独的实体,其起始逻辑通道ID为0。线程只能与该子部分中的其他线程交换数据。
__shfl()返回ID,由srcLane给出的线程所持有的var的值。如果srcLane不在0..width-1范围内,则返回线程自己的var值。指令的此变体可用于在warp内广播值。__shfl_up()通过从调用方的通道ID中,减去增量,并限制在0..width-1范围内,从而计算源通道ID 。__shfl_down()通过将增量添加到调用方的通道ID中,来计算源通道ID。
__shfl_up()和__shfl_down()分别启用,warp级扫描和反向扫描操作。__shfl_xor()通过对caller通道ID,与laneMask进行按位XOR运算,来计算源车道ID ;返回由生成的通道ID保留的var的值。该变体可用于,减少整个 warp(或子 warp)的变形。每个线程使用一系列不同顺序的关联运算符,来计算约简。
6.2. 块级基元
__syncthreads()默认用作barrier。导致所有线程等待,直到线程块中的每个线程,都到达__syncthreads()为止。Fermi指令集(SM 2.x),添加了几个新的块级屏障,汇总了有关线程块中线程的信息。
- __syncthreads_count():计算一个谓词,并返回该谓词为实际线程总和
- __syncthreads_or():返回线程块中所有输入的“或OR”
- __syncthreads_and():返回线程块中所有输入的AND
6.3. 性能计算
开发人员可以定义自己的性能计数器,使用__prof_trigger()内在函数,在实时代码中对其进行递增。
void __prof_trigger(int counter);
调用此函数,使每个计数器将相应的计数器加1。计数器必须在0..7范围内;保留计数器8..15。在profiler配置文件中,列出prof_trigger_00..prof_trigger_07,来获得计数器的值。
6.4. Video Instructions
本节中描述的视频说明,只能通过嵌入式PTX汇编器访问。这里描述了基本功能,以帮助开发人员确定,是否可能对应用程序有益。使用这些说明的任何人,都应查阅PTX ISA规范。
标量视频说明
标配有SM 2.0硬件的标量视频指令,可对视频处理所需的短(8位和16位)整数类型,进行有效操作。如PTX 3.1 ISA规范中,这些指令的格式如下。
vop.dtype.atype.btype{.sat} d, a{.asel}, b{.bsel};
vop.dtype.atype.btype{.sat}.secop d, a{.asel}, b{.bsel}, c;
源和目标算子均为32位寄存器。dtype, atype, and btype may be .u32 or .s32可以是.u32或.s32,无符号和有符号的32位整数。在asel/bsel符选择从源算子,其8位或16位解压:B0,B1,B2,和B3中选择字节(从最低显著编号),h0/h1选择最低significant和最高significant分别为16位。
提取输入值后,进行符号扩展或零扩展,以生成带符号的33位整数,并执行基本运算,从而生成一个34位中间结果,其符号取决于dtype。最后,将结果限制在输出范围,并执行以下操作之一。
- 将第二个运算(加,最小或最大值),应用于中间结果和第三个运算数。
- 将中间结果截断为8位或16位值,然后合并到第三个算子中的指定位置,产生最终结果。
将低32位写入目标算子。
VSET指令执行8位,16位或32位,输入算子之间的比较,并产生相应的谓词(1或0)作为输出。表14给出了PTX标量视频指令和相应的操作。
表14标量视频指令。

矢量视频指令(仅适用于SM 3.0)
这些与SM 3.0一起添加的指令,与标量视频指令相似,将输入提升为规范的整数格式,执行核心运算,缩放并有选择地合并输出。通过对成对的16位值,或四位8位值,提供更高的性能。
表15总结了PTX指令和这些指令实现的相应操作。对于视频处理和某些图像处理操作(例如中值滤波器)最有用。
表15矢量视频指令

6.5.Special Registers
通过引用内置变量threadIdx,blockIdx,blockDim和gridDim,访问许多特殊寄存器。这些伪变量将在3节中详细介绍,它们是3维结构,分别指定线程ID,块ID,线程数和块数。
除此之外,另一个特殊寄存器,SM的时钟寄存器,该寄存器随每个时钟周期递增。可以使用__clock()或__clock64()内部函数,读取此计数器。分别跟踪每个SM的计数器,就像CPU上的时间戳计数器,对于测量不同代码序列的相对性能最有用,在尝试计算挂钟时间时,最好避免使用。
GPU编程和流式多处理器(七)的更多相关文章
- GPU编程和流式多处理器(六)
GPU编程和流式多处理器(六) 5. 纹理和表面 读取和写入纹理和表面的指令,所引用的隐式状态,比其他指令要多得多.header中包含诸如基地址,尺寸,格式和纹理内容的解释之类的参数,该header是 ...
- GPU编程和流式多处理器(五)
GPU编程和流式多处理器(五) 4. 条件代码 硬件实现了"条件代码"或CC寄存器,其中包含用于整数比较的常用4位状态向量(符号,进位,零,溢出).可以使用比较指令(例如ISET) ...
- GPU编程和流式多处理器(四)
GPU编程和流式多处理器(四) 3.2. 单精度(32位) 单精度浮点支持是GPU计算的主力军.GPU已经过优化,可以在此数据类型上原生提供高性能,不仅适用于核心标准IEEE操作(例如加法和乘法),还 ...
- GPU编程和流式多处理器(三)
GPU编程和流式多处理器(三) 3. Floating-Point Support 快速的本机浮点硬件是GPU的存在理由,并且在许多方面,它们在浮点实现方面都等于或优于CPU.全速支持异常可以根据每条 ...
- GPU编程和流式多处理器(二)
GPU编程和流式多处理器(二) 2. 整数支持 SM具有32位整数运算的完整补充. 加法运算符的可选否定加法 乘法与乘法加法 整数除法 逻辑运算 条件码操作 to/from浮点转换 其它操作(例如,S ...
- GPU编程和流式多处理器
GPU编程和流式多处理器 流式多处理器(SM)是运行CUDA内核的GPU的一部分.本章重点介绍SM的指令集功能. 流式多处理器(SM)是运行我们的CUDA内核的GPU的一部分.每个SM包含以下内容. ...
- 流式处理的新贵 Kafka Stream - Kafka设计解析(七)
原创文章,转载请务必将下面这段话置于文章开头处. 本文转发自技术世界,原文链接 http://www.jasongj.com/kafka/kafka_stream/ Kafka Stream背景 Ka ...
- Java开发笔记(七十二)Java8新增的流式处理
通过前面几篇文章的学习,大家应能掌握几种容器类型的常见用法,对于简单的增删改和遍历操作,各容器实例都提供了相应的处理方法,对于实际开发中频繁使用的清单List,还能利用Arrays工具的asList方 ...
- tcp流式套接字和udp数据报套接字编程区别
1. 流式套接字采用字节流方式进行传输,而数据报套接字 使用数据报形式传输数据2. tcp套接字会产生粘包,udp有消息边界,不会形成粘包.3. tcp编程可以保证消息的完整性,udp则不能保证4. ...
随机推荐
- hdu4974 简单题
题意: 一个人看比赛,这些比赛一共有n个人参与,每一场有两个人比,然后每一场之后这个人都会给比赛的这两个人打分,最多1最少0,比如看完了A,B两人比赛,他可能给这两个人分别的分数是00,1 ...
- hdu4909 状态压缩(偶数字符子串)
题意: 给你一个字符串,里面最多有一个'?','?'可以表示'a' - 'z',也可以什么都不表 示,这里要明确,什么都不表示不是不存在的意思,当aa什么都不表示的时候aa 也不等于aa? ...
- Windows核心编程 第四章 进程(下)
4.3 终止进程的运行 若要终止进程的运行,可以使用下面四种方法: • 主线程的进入点函数返回(最好使用这个方法) . • 进程中的一个线程调用E x i t P r o c e s s函数(应该避免 ...
- PHP 父类方法如何访问子类属性
设计知识点 类与对象->后期静态绑定 出现的问题 A 类为父类 里面有一个方法为调用当前类的 $name 属性 当 B 类继承了 A类时 但是输出仍然是 A (父类) 的 属性? <?ph ...
- ppt技巧一四步法调整段落排版
声明:本文所有截图来源于网易云课堂--<和秋叶一起学PPT>,仅作为个人复习之用,特此声明!
- Java语言的三大特性
Java语言的三大特性 1.封装 1.1 概念: 封装也成为信息异常,隐藏对象的属性和实现细节,仅对外公开接口(外部不可以直接看到对象的属性细节并且不能直接更改属性的值,只能通过方法来读取或更改属性 ...
- 用nvm的方式安装node
一.nvm简介 Node Version Manager(Node版本管理工具)由于以后的开发工作可能会在多个Node版本中测试,而且Node的版本也比较多,所以需要这么款工具来管理. nvm的安 ...
- 【转载】linux 安装 中文输入法 Fcitx 手动
在 Linux(测试版)中安装中文输入法 由于一些原因,目前在 Linux(测试版)中无法调用系统的输入法,故需要安装第三方输入法为 Linux(测试版)中的应用提供中文输入支持.本文档旨在介绍第三方 ...
- Ansible_管理机密
一.Ansible Vault 1.什么是Ansible Vault Ansible提供的Ansible Vault可以加密和解密任何由Ansible使用的结构化数据文件 若要使用Ansible Va ...
- Linux 如何查看系统负载
Linux 如何查看系统负载 310 博客 / Linux/ 4个月前/ 534 / 0 操作系统的负载状态,反映了应用程序的资源使用情况,从中能找出应用程序优化的瓶颈所在. 系统平均负载, ...