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管道利用率的更多相关文章

  1. Java基础知识强化之IO流笔记82:NIO之 Pipe(管道)

    1. Java NIO 管道是2个线程之间的单向数据连接.Pipe有一个source通道和一个sink通道.数据会被写到sink通道,从source通道读取. 这里是Pipe原理的图示: 2. Pip ...

  2. python Pipe 双管道通信

    管道:是python多进程中一种交换数据的方式 from multiprocessing import Process,current_process,Queue,Pipe import time i ...

  3. 进程队列(Queue),Pipe(管道), Manager 进行进程之间的数据传递和传输

    进程Queue,实现进程传输的队列 1.Queue from multiprocessing import Process, Queue def f(q): q.put('1') q.put('2') ...

  4. 78.pipe多管道云端,客户端通信

    压力测试截图: 云端 定义管道缓存区大小,最多连接数量(线程个数),当前线程个数,管道名字 //缓冲区大小 #define SIZE 4096 //最多连接数量 #define MAX_CONNECT ...

  5. Linux下进程间通信方式——pipe(管道)

    每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程A把数据从用户空间拷到内核缓冲区,进程B再从内核缓冲区把 ...

  6. 用Python操作Named pipe命名管道,实用做法——os.read 或 os.write

    https://blog.csdn.net/mayao11/article/details/50618598

  7. pipe()管道最基本的IPC机制

    <h4>进程间通信 fork pipe pie_t 等用法(管道机制 通信)</h4>每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之 ...

  8. 管道Pipe

    管道Pipe java.nio.channels包中含有一个名为Pipe(管道)的类.广义上讲,管道就是一个用来在两个实体之间单向传输数据的导管.管道的概念对于Unix(和类Unix)操作系统的用户来 ...

  9. Linux - 简明Shell编程10 - 管道(Pipe)

    脚本地址 https://github.com/anliven/L-Shell/tree/master/Shell-Basics 示例脚本及注释 #!/bin/bash echo '##### Num ...

随机推荐

  1. DVWA之File Inclusion

    File Inclusion File Inclusion,意思是文件包含(漏洞),是指当服务器开启allow_url_include选项时,就可以通过php的某些特性函数(include(),req ...

  2. The 2014 ACM-ICPC Asia Mudanjiang Regional First Round J

    题意:       是个模拟题,就是给你一个字符串,问你他是不是"ABABA" 或者"ABABCAB"的模式,ABC是三个长度不为0且不同的串. 思路:     ...

  3. CString,string,char数组的转换

    来源:http://ticktick.blog.51cto.com/823160/317550 //----------------ANSI字符串转换为UNICODE字符串-------------- ...

  4. 我的主站 SHARELIST -分享列表 (功能持续完善中 2019-11-24 版本0.3)

    网站地址: http://www.sharelist.link 网站地址二维码: 网站介绍和更新: http://106.13.105.156/sharelist.php?listid=5dbda96 ...

  5. windows-CODE注入(远程线程注入)

    远程线程注入(先简单说,下面会详细说)今天整理下代码注入(远程线程注入),所谓代码注入,可以简单的理解为是在指定内进程里申请一块内存,然后把我们自己的执行代码和一些变量拷贝进去(通常是以启线程的方式) ...

  6. Sublime text3 的破解

    下载sublimeText3的安装包并安装(已经安装的可以忽略) 在hosts文件中添加:127.0.0.1 license.sublimehq.com(hosts文件地址:C:\Windows\Sy ...

  7. PHP中文转拼音扩展

    Pinyin 基于 CC-CEDICT 词典的中文转拼音工具,更准确的支持多音字的汉字转拼音解决方案. 安装 使用 Composer 安装: $ composer require "over ...

  8. IntelliJ IDEA打开Maven项目,Spring boot所有依赖红名,不可用

    导入外部的springboot项目时,出现报红线,无论怎么刷新maven就是不下载依赖包,情况如下 解决办法: 1)直接去自己的maven仓库,找到Spring boot,然后直接删除下面的文件 2) ...

  9. idea中properties配置文件没有代码提示及代码高亮问题解决方案

    更多精彩关注微信公众号 1.解决properties文件没有代码提示问题:首先,单击项目结构按钮,如下图: 然后,给项目添加Spring依赖支持,如下图: 2.解决代码不高亮问题:     代码不高亮 ...

  10. git的一些常用命令总结

    1.拉取代码Git clone  "链接名称" 2.新建分支 git checkout -b "分支名称" 3.提交代码步骤 (1)Git status查看项目 ...