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