本文来自魏继增科学网博客:链接地址:http://blog.sciencenet.cn/blog-1067211-726653.html
3.3.2Clock Domain Configuration
GPGPU-Sim支持4个时钟域,可以通过-gpgpu_clock_domains配置参数进行控制:
l DRAMclock domain= frequency of the real DRAM clock (command clock) and not the data clock (i.e.2x of the command clock frequency)
l SIMTCore Cluster clock domain = frequency of the pipeline stages in a core clock (i.e.the rate at which simt_core_cluster::core_cycle() is called)
l Icntclock domain= frequency of the interconnection network (usually this can be regarded as thecore clock in NVIDIA GPU specs)
l L2 clockdomain =frequency of the L2 cache (We usually set this equal to ICNT clock frequency)
注意,GPGPU-Sim中流水线的宽度等于warp的大小。为了补偿,我们调整SIMT核心簇时钟域。例如,我们建模运行在一个较快时钟频率(1GHZ+)的NVIDIA Quadro FX 5800(GT200) SM超流水段为另一个运行在1/4频率的较慢流水段。所以,FX 5800中的1.3GHZ shader时钟频率对应GPGPU-Sim中325MHZ SIMT核心的时钟频率。
DRAM的时钟域被指定为command时钟的频率。为了简化峰值存储带宽的计算,大多数GPU手册都报出data时钟频率,它是command时钟频率的2倍。例如,Quadro FX5800的data时钟频率为1600MHZ,则command时钟频率仅为800MHZ。因此,我们的配置集中DRAM时钟域被设置为800.0MHz。
3.3.2.1Clock Special Register
在ptx中,有一个特殊的寄存器%clock可以用于读取时钟周期的计数。在硬件上,这个寄存器称为SR1。它是一个时钟周期计数器。在Quadro中,这个计数器每个调度时钟递增两次。在Fermi中,这个计数器每个调度时钟递增一次。GPGPU-Sim返回的计数值每个调度周期递增一次(调度周期等于SIMT核心周期)。
在PTXPlus中,NVIDIA编译器产生如下的指令访问%clock寄存器。
//SASS accessing clock register
S2R R1, SR1
SHL R1, R1, 0x1
//PTXPlus accessing clock register
mov %r1, %clock
shl %r1, %r1, 0x1
基本上,从clock寄存器取出的值乘以2。然而,在PTX中,clock寄存器是直接访问的。因此,当基于clock寄存器计算的时候这些因素都应该考虑进去。
//PTX accessing clock register
mov r1, %clock
3.4Understanding Simulation Output
在每一个CUDA grid结束阶段。GPGPU-Sim向控制台(stdout)打印性能统计信息。这些性能统计信息提供了对于CUDA应用在GPU体系结构上仿真时的基本观察。
下面列出一些重要的性能统计信息:
3.4.1General Simulation Statistics
Description | |
gpu_sim_cycle | 执行kernel的总的时钟周期数目(以core的时钟周期为准) |
gpu_sim_insn | 执行kernel的总的指令数 |
gpu_ipc | gpu_sim_insn / gpu_sim_cycle |
gpu_tot_sim_cycle | 执行所发射的所有kernel后的总时钟周期数 |
gpu_tot_sim_insn | 执行所有kernel的总的指令数 |
gpu_tot_ipc | gpu_tot_sim_insn / gpu_tot_sim_cycle |
gpu_total_sim_rate | gpu_tot_sim_insn / wall_time |
3.4.2Simple Bottleneck Analysis
性能计数器跟踪GPU不同部分的挂起事件。结合起来,给出一个广义上的GPU对于一个应用的瓶颈所在。图6给出了GPGPU-Sim中一个存储器请求到存储子系统的简化流程,
图6 Memory request flowdiagram
下面是每个计数器的描述:
Statistic | Description |
gpgpu_n_stall_shd_mem | 在存储阶段流水线挂起的周期数,挂起由以下几个原因引起: l 共享memory bank冲突 l 不能合并(non-coalesced)的存储器访问 l 串行的常量存储器访问 |
gpu_stall_dramfull | 从互连网络到DRAM通道被挂起的周期数 |
gpu_stall_icnt2sh | DRAM通道由于互连网络拥塞造成挂起的时钟周期数 |
3.4.3Memory Access Statistics
Description | |
gpgpu_n_load_insn | 对于全局/本地存储器的load指令数目 |
gpgpu_n_store_insn | 对于全局/本地存储器的store指令数目 |
gpgpu_n_shmem_insn | 访问共享存储器的指令数目 |
gpgpu_n_tex_insn | 访问纹理存储器的指令数目 |
gpgpu_n_const_mem_insn | 访问常量存储器的指令数目 |
gpgpu_n_param_mem_insn | 访问参数存储器的指令数目 |
gpgpu_n_cmem_portconflict | 访问常量存储器出现bank冲突的次数 |
maxmrqlatency | 最大memory对列延迟(一个存储器请求在DRAM队列中花费的时间) |
maxmflatency | 最大memory取延迟(从shader到DRAM再返回的时间) |
averagemflatency | 平均memory取延迟 |
max_icnt2mem_latency | 一个memory请求从shader core到达DRAM通道的最大时间 |
max_icnt2sh_latency | 一个memory请求从DRAM通道返回shader core的最大时间 |
3.4.4Memory Sub-System Statistics
Description | |
gpgpu_n_mem_read_local | 本地存储器的读操作被从shader core放置到互连网络的次数 |
gpgpu_n_mem_write_local | 本地存储器的写操作被从shader core放置到互连网络的次数 |
gpgpu_n_mem_read_global | 全局存储器的读操作被从shader core放置到互连网络的次数 |
gpgpu_n_mem_write_global | 全局存储器的写操作被从shader core放置到互连网络的次数 |
gpgpu_n_mem_texture | 纹理存储器的读操作被从shader core放置到互连网络的次数 |
gpgpu_n_mem_const | 常量存储器的读操作被从shader core放置到互连网络的次数 |
3.4.5Control-Flow Statistics
GPGPU-Sim通过统计warp的占用分布情况(occupancy distribution)来衡量由于CUDA应用中由于分支分叉造成的性能损失。这个信息由下面一行进行显示“Warp OccupancyDistribution:”。作为一种选择,你也许想查找W0_Idle。占用分布按下列格式显示:<bin>:<cyclecount>。每种bin的含义如下:
Statistic | Description |
Stall | Shader core流水线被挂起并且不能发射任何指令的时钟周期数 |
W0_Idle | 所有的warp都被发射到流水线并且尚未准备好执行下一条指令所需的时钟周期数 |
W0_Scoreboard | 所有的warp都在等待从memory中获取数据所需要的时钟周期数 |
WX (where X = 1 to 32) | 当一个具有X个激活线程的warp被调度时所需要的时钟周期数 |
3.4.6DRAM Statistics
GPGPU-Sim为每个DRAM通道统计如下信息:
Statistic | Description |
一个memory通道内MC所发射的所有指令的数目。MC每个指令周期发射一个命令 | |
n_nop | MC发射的NOP指令的数目 |
n_act | MC发射的行激活指令的数目 |
n_pre | MC发射的预充电指令的数目 |
n_req | DRAM通道所处理的memory请求的数目 |
n_rd | MC发射的读指令的数目 |
n_write | MC发射的写指令的数目 |
bw_util | DRAM带宽利用率 = 2 * (n_rd + n_write) / n_cmd |
n_activity | 当MC的队列中有一个挂起请求的时候,所发射指令的数目 |
dram_eff | DRAM效率 = = 2 * (n_rd + n_write) / n_activity(即当有一个挂起请求等待处理的时候,DRAM带宽利用率) |
mrqq: max | 最大memory请求队列占用量(即队列中挂起条目的最大量) |
mrqq: avg | 平均memory请求队列占用量(即队列中挂起条目的平均量) |
3.4.7Cache Statistics
对于每一种Cache(数据Cache,常量Cache,纹理Cache),GPGPU-Sim显示如下统计信息:
l Access = 对Cache进行访问的总次数
l Miss = Cache Miss的总次数。圆括号中的数字是Miss率
l PendingHit = Cache中pending hit的次数。一个pending hit访问命中具有RESERVED状态的cache line,这表示已经有一个由于之前对于同一个line的Cache miss引起的存储器请求正在处理。这种访问可以与之前的存储器访问进行合并以至于不产生memory traffic。圆括号中的数字pending hit访问的比例。
注意,pending hit没有被统计为cache miss。此外,我们对于采用allocate-on-fill策略的cache统计pending hit(即只读型Cache,如常量和纹理Cache)。
GPGPU-Sim还针对所有L1数据cache的实例,计算总的miss率:
total_dl1_misses
total_dl1_accesses
total_dl1_miss_rate
注意,L1总的miss率应当被忽略,当L1 Cache被关掉的时候:-gpgpu_cache:dl1 none。
3.4.8Interconnect Statistics
在GPGPU-Sim中,用户可以配置是运行所有的traffic在一个互连网络上,还是两个分离的物理网络(一个传播数据从shader core到DRAM通道,另一个反向传播数据)。(之所以使用两个分离网络,除了为了增加带宽,还为了避免“protocol deadlock”,否则将需要额外的专用虚拟通道。)GPGPU-Sim针对每个单独互连网络显示如下统计信息:
Statistic | Description |
average latency | 从源节点到目的节点数据移动的平均延迟 |
average accepted rate | 衡量互连网络相对于它总的输入通道吞吐量的平均吞吐量。注意,当使用两个分离网络的时候,一些节点从来不会向网络总注入数据(cores-to-dram网络中DRAM通道节点只能作为输出)。为了得到真实的比例,这些节点的输入通道吞吐量应当被忽略。注意,默认情况下,通过在互连网络配置文件中设置network_count选项以使用两个分离的网络。分离网络可以避免deadlock。 |
min accepted rate | 总是“0”,因为当针对两个方向的传输仿真两个互连网络的时候,总有一些节点不会向互连网络注入数据。 |
latency_stat_0_freq | 一个直方图显示互连网络中数据传输延迟的分布 |
注意:网络的accepted traffic/吞吐量是传输到网络目的端的通信量的总和。如果网络低于饱和,则所有提供的通信量将被网络接收并且提供的通讯量就等于网络的吞吐量。互连网络仿真器计算每个节点的接收率 = 一个节点接收到总包数/网络的总cycle数。