Pipe Utilization管道利用率
Pipe Utilization管道利用率
概述
CUDA设备的每个流式多处理器(SM)都具有许多专门用于执行特定任务的硬件单元。在芯片级,这些单元提供执行管道,翘曲调度程序将指令发送到这些管道。例如,结构单元提供执行结构获取和执行结构过滤的功能。加载/存储单元获取数据并将其保存到内存中。了解这些管道的利用率并了解它们与目标设备的峰值性能有多接近,是分析内核执行效率的关键信息;还可以确定由于超标订购特定类型的管道而导致的性能瓶颈。
背景
开普勒GK110白皮书和NVIDIA GeForce GTX 680白皮书都描述并比较了最新CUDA计算设备的架构细节。下表简要总结了SM的单位计数及其每个周期对应的管道吞吐量:
对于这些体系结构吞吐量数字,管道利用率指标报告运行时每个管道的观察利用率。高管道利用率表明,在内核执行期间,相应的计算资源被大量使用并且经常处于忙碌状态。低值表示管道不经常使用,资源闲置。单个管道的结果彼此独立;将两个或多个管道利用率百分比相加不会产生有意义的值。由于管道度量报告为内核启动期间的平均值,因此低值不一定排除管道在内核执行期间的某个时间点是瓶颈。
算术指令由多个管道执行,如前表中32位浮点指令和特殊函数操作的两个示例所示。这些管道提供了非常不同的吞吐量,反过来导致了本地算术指令的不同吞吐量,如CUDA C编程指南所述。对于本实验支持的CUDA设备,这些运算吞吐量为:
根据定义,指令吞吐量表示每个SM每个周期可以处理多少操作。换言之,与指令吞吐量较低的操作相比,具有高吞吐量的操作的发出成本更低。算术工作负载使用这个简化的成本模型,通过加权发出的指令计数和相应的反向指令吞吐量。这样做可以评估哪种类型的算术指令占整个处理成本的多少。这对于算术管道利用率高的内核来说尤其有用,以确定哪类算术操作可能达到了可用吞吐量限制。
Charts
Pipe Utilization |
显示在内核执行期间SMs的四个主要逻辑管道的平均利用率。有助于调查管道是否被超额订阅,从而限制了内核的性能。这也有助于估计添加更多的工作是否能够很好地扩展,或者是否会达到管道限制。在这种情况下,增加更多的工作可能是指增加更多的算术工作负载(例如,通过提高某些计算的准确性)、增加内存操作的数量(包括引入寄存器溢出),或者增加每个SM的活动扭曲数目的目的是改进指令延迟隐藏。
报告的值是内核执行期间的平均值。低利用率并不保证管道在内核执行期间的某个时刻不会被超额订阅。
Metrics
Load / Store
加载/存储包括所有发出的指令,这些指令触发对目标设备的内存系统的请求,不包括结构操作。负责全局、本地、共享内存以及任何原子操作的加载和存储操作。还包括泄漏登记。计算能力3.5及更高版本的设备支持通过只读数据缓存(LDG)加载全局内存;这些操作不影响加载/存储组,而是在结构管道利用率中考虑。在高负载/存储利用率的情况下,收集内存实验以获得有关执行的内存操作的类型、计数和效率的更多信息。
结构覆盖所有执行结构提取的已发出指令,对于计算能力为3.5及更高版本的设备,通过只读数据缓存(LDG)加载全局内存。如果这个指标很高,请运行内存-结构实验来更详细地评估执行的结构请求。
控制流包括所有对控制流有影响的已发出指令,如分支指令(BRA、BRX)、跳转指令(JMP、JMX)、函数调用(CAL、JCAL)、循环控制指令(BRK、CONT)、返回指令(RET)、程序终止(EXIT)和屏障同步(BAR)。有关这些单独指令的详细信息,请参阅“指令集参考”。如果控制流利用率很高,请运行分支统计实验;这有助于了解控制流对总体内核执行性能的影响。
算术涵盖所有发出的浮点指令、整数指令、转换操作和移动指令。请参阅“指令集参考”,以获取这些组中每个组的汇编指令的详细列表。如果算术管道利用率很高,请检查算术工作负载图,以确定成本最高的指令类型。
Arithmetic Workload
提供各种算术指令的估计成本分布。成本模型是基于问题计数加权相应的指令吞吐量的倒数。指令类与本文背景部分给出的算术吞吐量表的行相匹配。
算术指令由芯片上的多个流水线执行,这些流水线可以并行运行。因此,算术工作负载分布并不是流水线利用率图表所示算术流水线百分比的真实划分;然而,成本估计值最高的指令类型很可能导致最高的片上流水线利用率。
Metrics
All references to individual assembly instructions in the following metric descriptions refer to the native instruction set architecture (ISA) of CUDA devices as further described in the Instruction Set Reference.
FP32 Estimated workload for all 32-bit floating-point add (FADD
), multiply (FMUL
), multiply-add (FMAD
) instructions.
FP64 Estimated workload for all 64-bit floating-point add (DADD
), multiply (DMUL
), multiply-add (DMAD
) instructions.
FP32 (Special) Estimated workload for all 32-bit floating-point reciprocal (RCP
), reciprocal square root (RSQ
), base-2 logarithm (LG2
), base 2 exponential (EX2
), sine (SIN
), cosine (COS
) instructions.
I32 (Add) Estimated workload for all 32-bit integer add (IADD
), extended-precision add, subtract, extended-precision subtract, minimum (IMNMX
), maximum instructions.
I32 (Mul) Estimated workload for all 32-bit integer multiply (IMUL
), multiply-add (IMAD
), extended-precision multiply-add, sum of absolute difference (ISAD
), population count (POPC
), count of leading zeros, most significant non-sign bit (FLO
).
I32 (Shift) Estimated workload for all 32-bit integer shift left (SHL
), shift right (SHR
), funnel shift (SHF
) instructions.
I32 (Bit) Estimated workload for all 32-bit integer bit reverse, bit field extract (BFE
), bit field insert (BFI
) instructions.
Logical Ops Estimated workload for all logical operations (LOP
).
Shuffle Estimated workload for all warp shuffle (SHFL
) instructions.
Conv (From I8/I16 to I32) Estimated workload for all type conversions from 8-bit and 16-bit integer to 32-bit types (subset of I2I
).
Conv (To/From FP64) Estimated workload for all type conversions from and to 64-bit types (subset of I2F
, F2I
, and F2F
).
Conv (All Other) Estimated workload for all all other type conversions (remaining subset of I2I
, I2F
, F2I
, and F2F
).
Analysis
如果装载/储存管道利用率高…
…运行内存实验,寻找超出每个请求的理想事务数的内存操作;改进这些非最佳内存访问可以减少加载/存储管道的负载。
…考虑是否可以通过使用不同的实现或不同的算法来减少执行的内存操作的总数。
…并且单个线程访问内存中的连续值,确保使用最宽的内存访问类型来执行操作。例如,如果每个线程需要读取128字节的连续内存,那么在一次128字节的访问中读取数据要比执行4次32字节的访问要好。为此,请使用内置向量类型。
…并且内存统计-本地实验显示本地内存请求数很高,可以打印PTX优化汇编程序的代码生成统计信息(--ptxas options=-v)以获得溢出字节数;如果高,请尝试通过更改内核启动的执行配置或启动边界来减少溢出。
如果纹理管道利用率高…
…运行内存统计-纹理实验,并研究纹理提取的效率。
…考虑是否可以通过使用不同的实现或不同的算法来减少执行的纹理操作的总数。还要检查内核是否已经接近目标设备的预期峰值纹理性能。
如果控制流管道利用率高…
…进行分支统计实验。在低控制流效率和高流量控制发散的情况下,尝试以最小化翘曲发散为目标重新组合核心网格的线程。
如果算术管道利用率高…
…检查算术工作负载并开始优化成本最高的指令类型。在可能的情况下,喜欢更快、更专业的数学函数,而不是更慢、更通用的函数。另请参阅CUDAC最佳实践指南中的优化算术指令的一般提示。
…运行实现的FLOPS实验和实现的IOPS。检查内核是否接近目标设备的峰值性能,并研究是否有可能减少执行的算术指令数。
Pipe Utilization管道利用率的更多相关文章
- Java基础知识强化之IO流笔记82:NIO之 Pipe(管道)
1. Java NIO 管道是2个线程之间的单向数据连接.Pipe有一个source通道和一个sink通道.数据会被写到sink通道,从source通道读取. 这里是Pipe原理的图示: 2. Pip ...
- python Pipe 双管道通信
管道:是python多进程中一种交换数据的方式 from multiprocessing import Process,current_process,Queue,Pipe import time i ...
- 进程队列(Queue),Pipe(管道), Manager 进行进程之间的数据传递和传输
进程Queue,实现进程传输的队列 1.Queue from multiprocessing import Process, Queue def f(q): q.put('1') q.put('2') ...
- 78.pipe多管道云端,客户端通信
压力测试截图: 云端 定义管道缓存区大小,最多连接数量(线程个数),当前线程个数,管道名字 //缓冲区大小 #define SIZE 4096 //最多连接数量 #define MAX_CONNECT ...
- Linux下进程间通信方式——pipe(管道)
每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程A把数据从用户空间拷到内核缓冲区,进程B再从内核缓冲区把 ...
- 用Python操作Named pipe命名管道,实用做法——os.read 或 os.write
https://blog.csdn.net/mayao11/article/details/50618598
- pipe()管道最基本的IPC机制
<h4>进程间通信 fork pipe pie_t 等用法(管道机制 通信)</h4>每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之 ...
- 管道Pipe
管道Pipe java.nio.channels包中含有一个名为Pipe(管道)的类.广义上讲,管道就是一个用来在两个实体之间单向传输数据的导管.管道的概念对于Unix(和类Unix)操作系统的用户来 ...
- Linux - 简明Shell编程10 - 管道(Pipe)
脚本地址 https://github.com/anliven/L-Shell/tree/master/Shell-Basics 示例脚本及注释 #!/bin/bash echo '##### Num ...
随机推荐
- 提示No input file specified的解决方法
(一)IIS Noinput file specified 方法一:改PHP.ini中的doc_root行,打开ini文件注释掉此行,然后重启IIS 方法二: 请修改php.ini 找到 ; cgi. ...
- hdu4282 x^z+y^z+x*y*z=k 解的个数
题意: x^z + y^z + x*y*z = k; (x < y ,z > 1),给你一个k问有多少组解. 思路: 暴力枚举z,y,然后二分查找x.注意一点最好用 ...
- DVWA之Command injection(命令执行漏洞)
目录 Low Medium Middle Impossible 命令执行漏洞的原理:在操作系统中, & .&& .| . || 都可以作为命令连接符使用,用户通过浏览器 ...
- 使用docker-compose.yml快速搭建Linux/Mac开发/生产环境
传送门 点击进入Github,https://github.com/ovim/dockerfiles 简单介绍 Dockerfiles 搭建基础公用环境包,方便使用,支持业务不断的提升而需要一些软件的 ...
- gitlab + php自动部署
功能简介 本地往服务器推送代码之后,触发web钩子,服务器拉取刚刚推送的代码 步骤 1.在gitlab后台配置钩子 项目->编辑项目->Web钩子->新增钩子 2.在服务器端为www ...
- 【Redis】启动redis提示Could not connect to Redis at 127.0.0.1:6379: Connection refused 已解决
1.配置redis.conf文件,将daemonize no 为 daemonize yes即可(让redis作为守护进程运行)
- 浅析DDD——领域驱动设计的理解
浅析DDD--领域驱动设计的理解 我觉得领域驱动设计概念的提出,是为了更清晰的区分边界.这里的边界包括业务边界和功能的边界,每个边界都包含具体的领域对象,当业务和功能的领域对象一一对应上之后,业务的变 ...
- C++的指针相关概念
引言 初入c++,肯定会对指针这个概念非常熟悉.但是为什么c/c++要使用指针? 其实每一种编程语言都使用指针,指针并不只是C/C++的独有特性.C++将指针暴露给了用户(程序员),而Java和C#等 ...
- @JsonFormat 格式化时间 时出现时间不准确问题
今天突然报个问题,简单来说说就是数据库某一字段的记录时间为 14点,然而展示到前台却是 6点 我腚眼一看,postman测试的数据也是6点 然而idea查出来的并不是6点 再仔细一瞅idea实体类的时 ...
- JAVA的基本介绍和JDK的安装
JAVA帝国 JAVA特性和优势 简单 面向对象 可复制性 高性能 分布式 动态性 多线性 安全性 健壮性 JAVA三大版本 javaSE:标准版(桌面程序.控制台开发) javaME(嵌入式开发) ...