这个答案适用于Compute Capability 2.0 - 3.7(Fermi - Kepler)设备。
每个循环,每个SM warp调度程序选择一个warp并发出1-2个独立指令。
事件 inst_executed 是完成的扭曲指令的计数。 thread_inst_executed 是完成指令的线程计数。
如果SM由于
而无法完成发出的指令
- 常量高速缓存未命中立即常量(指令中引用的常量),
- 在索引常量负载中解决分歧,
- 解决全局/本地内存加载或存储中的分歧,
- 共享内存加载或存储中的银行冲突,
- 解决原子或还原操作中的冲突,
- 加载或存储操作要求将数据写入加载存储单元或从超出读/写总线宽度的单元读取(例如128位加载或存储),或
- 加载高速缓存未命中(当数据在高速缓存中准备好时,重放发生以获取数据)
醇>
然后SM调度程序必须多次发出指令。这称为指令重放。值inst_issued == inst_issued2 * 2 + inst_issued1 是已完成的指令数+指令重放。
指令重放使用指令发布槽来降低SM的计算吞吐量。
下面列出的 _replay_overhead 指标可以帮助您确定导致重播的操作类型。 _replay 事件可以提供量级。
NVPROF / CUPTI活动和指标
EVENT GROUP 1 - 通用指令发布和退休计数
- inst_executed:执行的指令数,不包括重放。
- inst_issued1:每个周期发出的单指令数
- inst_issued2:每个周期发出的双指令数
- inst_issued0:未发出任何指令的周期数,每个warp的增量。
EVENT GROUP 2 - 计算或重播上面列出的特定类型的事件(并非所有事件都有计数)
- shared_load_replay:由于共享加载库冲突(当两个或多个共享内存加载请求的地址落在同一个内存库中时)或者没有冲突但由所有三个访问的单词总数而导致的重放
执行该指令的warp中的广告超过了一个周期内可加载的字数(256字节)。
- shared_store_replay:由于共享存储库冲突导致的重放(当两个或多个共享内存存储请求的地址落在同一个内存库中时)或者没有冲突但是所有访问的字总数时
读取warp执行该指令超过了可以在一个周期内存储的单词数。
- global_ld_mem_divergence_replays:全局内存加载的指令重放次数。如果指令正在访问多个128字节的高速缓存行,则重放指令。对于每个额外的高速缓存行访问,计数器增加1。
- global_st_mem_divergence_replays:全局内存存储的指令重放次数。如果指令正在访问多个128字节的高速缓存行,则重放指令。对于每个额外的高速缓存行访问,计数器增加1。
METRIC GROUP - 效率计算。
- inst_replay_overhead:每条指令的平均重放次数
执行
- local_replay_overhead:由于的平均重播次数
执行每条指令的本地内存访问
- atomic_replay_overhead:原子和原子的平均重放次数
执行每条指令的减少银行冲突
- global_replay_overhead:全局播放的平均播放次数
内存缓存未命中执行的每条指令
- shared_replay_overhead:由于共享而产生的平均重放次数
执行每条指令的内存冲突
- global_cache_replay_overhead:由于的平均重播次数
执行每条指令的全局内存缓存未命中
计算能力5.x 设备(Maxwell)设备将重放从warp调度程序推送到各个单元。这减少了重放延迟并释放了调度程序以发出数学运算。在这些设备上,inst_issued / inst_executed = inst_replay_overhead的比率通常接近于0.