如何解释CUDA中的指令重放

Ste*_*ang 1 cuda

任何人都可以总结一下CUDA中不同类型的指令重放的定义和原因吗?

他们是:

  1. inst_replay_overhead:
  2. shared_replay_overhead:
  3. global_replay_overhead:
  4. global_cache_replay_overhead
  5. local_replay_overhead
  6. atomic_replay_overhead
  7. shared_load_replay
  8. shared_store_replay
  9. global_ld_mem_divergence_replays
  10. global_st_mem_divergence_replays

Gre*_*ith 7

这个答案适用于Compute Capability 2.0 - 3.7(Fermi - Kepler)设备.

每个循环每个SM warp调度程序选择一个warp并发出1-2个独立指令.

inst_executed事件是完成的扭曲指令的计数.thread_inst_executed是完成指令的线程计数.

如果SM由于无法完成发布的指令

  1. 常量高速缓存未命中立即常量(指令中引用的常量),
  2. 在索引的恒定负载中解决分歧,
  3. 解决全局/本地内存加载或存储中的差异,
  4. 共享内存加载或存储中的银行冲突,
  5. 解决原子或还原操作中的冲突,
  6. 加载或存储操作需要将数据写入加载存储单元或从超出读/写总线宽度的单元读取(例如128位加载或存储),或者
  7. 加载高速缓存未命中(当数据在高速缓存中准备好时,重放发生以获取数据)

那么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执行中所有thre广告访问的单词总数而导致的重放该指令超过了一个周期内可加载的字数(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:由于执行的每条指令的全局内存缓存未命中而导致的平均重放次数

Compute Capability 5.x设备(Maxwell)设备将重放从warp调度程序推送到各个单元.这减少了重放延迟并释放了调度程序以发出数学运算.在这些设备上,inst_issued/inst_executed = inst_replay_overhead的比率通常接近于0.