CUDA 中指令重放的其他原因
Posted
技术标签:
【中文标题】CUDA 中指令重放的其他原因【英文标题】:Other reasons for instruction replays in CUDA 【发布时间】:2014-02-28 18:51:48 【问题描述】:这是我从 nvprof (CUDA 5.5) 得到的输出:
Invocations Metric Name Metric Description Min Max Avg
Device "Tesla K40c (0)"
Kernel: MyKernel(double const *, double const *, double*, int, int, int)
60 inst_replay_overhead Instruction Replay Overhead 0.736643 0.925197 0.817188
60 shared_replay_overhead Shared Memory Replay Overhead 0.000000 0.000000 0.000000
60 global_replay_overhead Global Memory Replay Overhead 0.108972 0.108972 0.108972
60 global_cache_replay_overhead Global Memory Cache Replay Ove 0.000000 0.000000 0.000000
60 local_replay_overhead Local Memory Cache Replay Over 0.000000 0.000000 0.000000
60 gld_transactions Global Load Transactions 25000 25000 25000
60 gst_transactions Global Store Transactions 75000 75000 75000
60 warp_nonpred_execution_efficie Warp Non-Predicated Execution 99.63% 99.63% 99.63%
60 cf_issued Issued Control-Flow Instructio 44911 45265 45101
60 cf_executed Executed Control-Flow Instruct 39533 39533 39533
60 ldst_issued Issued Load/Store Instructions 273117 353930 313341
60 ldst_executed Executed Load/Store Instructio 50016 50016 50016
60 stall_data_request Issue Stall Reasons (Data Requ 65.21% 68.93% 67.86%
60 inst_executed Instructions Executed 458686 458686 458686
60 inst_issued Instructions Issued 789220 879145 837129
60 issue_slots Issue Slots 716816 803393 759614
内核使用 356 字节 cmem[0] 并且没有共享内存。此外,没有寄存器溢出。 我的问题是,在这种情况下指令重播的原因是什么?我们看到了 81% 的开销,但这些数字并没有相加。
谢谢!
【问题讨论】:
【参考方案1】:一些可能的原因:
-
共享内存库冲突(您没有)
常量内存冲突(即,warp 中的不同线程从同一条指令请求常量内存中的不同位置)
warp-divergent 代码(if..then..else 为 warp 中的不同线程采用不同的路径)
这个presentation 可能很有趣,尤其是幻灯片 8-11。
【讨论】:
谢谢罗伯特。当我们想要发出加载/存储指令但所有功能单元都忙时,我们将停止。停顿是否计入指令重播? 另外,在我的代码中,所有线程总是访问常量内存中的相同位置,并且扭曲分歧也很小(仅发生在我使用的 256 个块之一中)。您能提出其他原因吗?以上是关于CUDA 中指令重放的其他原因的主要内容,如果未能解决你的问题,请参考以下文章