[笔记] GPGPU-SIM的使用说明(二)

本文来自魏继增科学网博客:链接地址: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

Statistic

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

Statistic

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

Statistic

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

n_cmd

一个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数。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值