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 中指令重放的其他原因的主要内容,如果未能解决你的问题,请参考以下文章

如何查看 GDB 存储的用于记录/重放的执行日志?

如何将 API 重放的 JSON 中的值放到另一个 API 发布方法的主体中?

重放攻击-实例解析

Pytorch使用指定的GPU

说说API的重放机制

数据包重放