关于Visual Profiler中instructions_issued的问题

正在学习CUDA,最近看到一个资料,里面提到可以用Visual Profiler来帮助判断编写的程序是计算占优还是访存占优。

资料里提到用比较32*(instructions_issued)与128B*(global_store_transaction+l1_global_load_miss)的大小,若是4.5:1(ECC off时则是3.6:1)就可认为是均衡的。

可问题是,我在Profiler中找到了四项,实际测试了一个自己写的程序,结果差别很大:
instructions_issued1_0 : 19549100
instructions_issued1_1 : 274528
instructions_issued2_0 : 19528158
instructions_issued2_1 : 274528

请问这四项分别是什么含义?在计算时应该用哪一项?

并不是所有的指令吞吐计算都是用32*(instructions_issued)这个公式。
比如Kepler显卡应该用32*(inst_issued_1+inst_issued_2*2)
具体公式,你可以参考CUDA_Profiler_users_guide 中Metrics reference部分。

ZHW同学能否发一下这些inst_issued_1之类的具体含义?

手册中很多数据都没有给出意思的?能否一次性发齐?我不知道他们很多都是什么,日常使用很费解。

当然,如果涉及保密那就算了。:slight_smile:

是啊,要是能把各个参数的含义一次发齐就好了~~

手册里只有各个Metric的含义与计算方法,却没有Event的含义说明,虽然大部分看名字能猜到意思,但总有一部分很难搞清楚,比如这里的“instructions_issued1_0、instructions_issued1_1、instructions_issued2_0、instructions_issued2_1”,我就搞不清楚这四个有什么区别……

优化过程中应该不需要了解具体instruction_issued1_0指得是哪个发射器发射的什么warp指令,每一代GPU也会有不一样。相比重要的是总体指令的吞吐量是多少。但是如果想知道具体意义,也可以用命令行工具 nvprof --query-events 找到:inst_issued1:Number of sngle instruction issued per cycle.
inst_issued2:Number of dual instructions issued per cycle.