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

本文来自魏继增科学网博客:链接地址:http://blog.sciencenet.cn/blog-1067211-726653.html 

3.1 Simulation Modes

   默认情况下,大多数的使用者使用GPGPU-Sim 3.x评估GPU运行一个应用所需要的时钟周期数。这就是性能仿真模型。当尝试在GPGPU-Sim上运行一个新的应用,则有可能该应用的运行结果不正确,即可能产生错误的数据。为了帮助调试应用,GPGPU-Sim 3.x还支持快速的功能仿真。GPGPU-Sim 3.x还支持在NVIDIA GPU上执行本地硬件ISA,通过一种扩展的PTX语法,称为PTXPlus。下面各小节将依次介绍这些特征。

 

3.1.1 Performance Simulation

   性能仿真是仿真器默认的仿真模式,它能够收集各种性能参数,但仿真速度较慢。GPGPU-Sim仿真在Microarchitecture Model一节中描述的微架构。

   为了选择性能仿真模式,在gpgpusim.config文件中添加如下所示的语句:

-gpgpu_ptx_sim_mode 0

关于仿真的输出的更多信息参见“understanding simulationoutput”小节。

 

3.1.2Pure Functional Simulation

纯功能仿真比性能仿真的仿真速度更快,但是它仅能够执行CUDA/OpenCL程序,不能够收集任何性能统计信息。

为了选择纯功能仿真模式,在gpgpusim.config文件中添加如下所示的语句:

  -gpgpu_ptx_sim_mode1

作为另一种选择,你可以设置环境变量PTX_SIM_MODE_FUNC为“1”。然后就可以利用性能仿真模式执行程序了。

仅仅仿真一个GPU设备的功能,GPGPU-Sim纯功能仿真模式执行CUDA/OpenCL程序就好像他们运行在一个真实的GPU设备上,所以在这种模式里不会收集任何性能统计信息,仅仅一个GPU程序的常规输出被显示。纯功能仿真模式比性能仿真快很多(大约快5~10倍)。

这个模式非常有用,假如你想快速的验证你的代码在GPGPU-Sim上是否工作正确,或者假如你想在没有真正的GPU计算设备的情况下增加CUDA/OpenCL的编程经验。纯功能仿真和性能仿真一样,对于PTXPlus支持同样版本的CUDA(CUDA v3.1和V2.3)。纯功能仿真以warp为单位执行程序,每个Cooperative Thread Array(CTA)中的warp执行直到所有都执行完毕或者等待在一个barrier处,对于后一种情况,一旦所有的warp等待在barrier,他们被清理并跨越barrier继续执行。

 

3.1.3Interactive Debugger Mode

   交互式调试模式提供一个类似GDB的接口对GPGPU-Sim中的功能行为进行调试。然后,当前它只能工作在性能仿真模式下。

   为了使用交互调试模式,设置环境变量GPGPUSIM_DEBUG为“1”。其所支持的命令如下所示:

Command

Description

dp  

显示流水线:显示编号为的SIMT核心的流水线中的内容

q

退出

b  :

对于线程id为的线程,在:处设置断点

d  

删除断点

s

对于所有的核心单步执行到下一个core cycle

c

采用非单步方式继续执行下去

w  

在地址

设置监测点(watchpoint)

l

在当前断点列出PTX指令

h

显示帮助信息

 

   调试功能的实现在文件debug.h和debug.cc中。

 

3.1.4Cuobjdump Support

   在当前的GPGPU-Sim 3.1.0版本中,对于cuobjdump的使用支持被添加。Cuobjdump是一个由NVIDIA提供的软件,它能够从二进制文件中抽取SASS和PTX信息。GPGPU-Sim支持使用cuobjdump抽取它运行SASS或PTX所需要的信息,以替代从cubin文件中获取这些信息。使用cuobjdump仅支持CUDA 4.0。Cuobjdump默认是打开的,假如仿真器是在CUDA 4.0下被编译的。为了打开/关闭cuobjdump,可以在你的配置文件中添加如下配置信息:

   # disable cuobjdump

-gpgpu_ptx_use_cuobjdump 0

# enable cuobjdump

-gpgpu_ptx_use_cuobjdump 1

 

3.1.5PTX vs. PTXPlus

默认情况下,GPGPU-Sim 3.x仿真PTX指令。然而,当在一个实际的GPU上执行时,PTX被重新编译为本地的GPU ISA(SASS)。这个重编译并不能用正常的PTX指令进行解释。为了解决这个问题,我们创建了PTXPlus。PTXPlus是GPGPU-Sim 3.x引入的一种PTX扩展模式,它从GT200 SASS指令到PTXPlus指令的1对1映射。它引入了在PTX中不存在的新指令和寻址模式。当转化到PTXPlus设置被激活,构成程序的SASS指令被转化为PTXPlus指令,然后可在GPGPU-Sim上进行仿真。使用PTXPlus转化设置可以得到更加精确仿真结果。然而,到PTXPlus的转化并不支持所有可以通过PTX进行仿真的程序。当前,仅高于4.0的CUDA Toolkit支持到PTXPlus的转化。

为了从可执行文件转化为SASS,GPGPU-Sim cuobjdump,一个NVIDIA CUDA toolkit提供的软件可以从CUDA可执行文件中抽取PTX,SASS和其他的信息。GPGPU-Sim 3.x包含一个单机程序,叫做cuobjdump_to_ptxplus,被调用将cuobjdump的输出转化为GPGPU-Sim可以仿真的PTXPlus。cuobjdump_to_ptxplus是一个C++程序。一个关于PTXPlus转化过程的详细描述请参见“PTXPlus Conversion”一节。当前,cuobjdump_to_ptxplus支持SASS的转化对于sm版本

为了打开PTXPlus仿真,在gpgpusim.config文件中添加如下所示的语句:

-gpgpu_ptx_convert_to_ptxplus 1

被转化的PTXPlus可以保存在名为“"_#NaNxplus”的文件中,在gpgpusim.config文件中添加如下所示的语句:

-gpgpu_ptx_save_converted_ptxplus 1

如果想关掉任何一个中设置,可以删除相应的行或将值从“1”改为“0”。更多关于PTXPlus的细节可以参照“PTXPlus support”一节。如果上述的设置都是打开的,GPGPU-Sim试图将SASS代码转化为PTXPlus,然后运行PTXPlus。然而,如上所述,并不是所有的程序都支持这种模式。

 

3.3Configuration Options

   配置参数被传入GPGPU-Sim通过gpgpusim.config和一个互连网络配置文件(通过在gpgpusim.config中设置-inter_config_file)。GPGPU-Sim 3.0.2中的configs文件夹内包含了NVIDIA GT200(configs/QuadroFX5800/)和Fermi架构(configs/Fermi/)的配置文件。

   所有的配置参数如下列表所示:

Simulation Run Configuration

Option

Description

-gpgpu_max_cycle <# cycles>

经过了<# cycles>个cycle后,终止GPGPU-Sim仿真(0=no limit)

-gpgpu_max_insn <# insns>

经过了<# insns>个指令后,终止GPGPU-Sim仿真(0=no limit)

-gpgpu_ptx_sim_mode  <0=performance (default), 1=functional>

选择性能仿真模型或功能仿真模型

-gpgpu_deadlock_detect <0=off,  1=on (default)>

在死锁的时候停止仿真

-gpgpu_max_cta

可以在GPU上并发运行的cta数目(0=no limit)

-gpgpu_max_concurrent_kernel

可以在GPU上并发运行的最大的kernel数目

Statistics Collection  Options

Option

Description

-gpgpu_ptx_instruction_classification  <0=off, 1=on (default)>

打开指令分类

-gpgpu_runtime_stat  :

显示运行时统计信息

-gpgpu_memlatency_stat

收集存储器延迟统计信息(0x2 enables MC, 0x4  enables queue logs)

-visualizer_enabled <0=off, 1=on  (default)>

打开visualizer输出(使用AerialVision可视化工具画出log文件中保存的数据曲线)

-visualizer_outputfile  

为visualizer指定输出文件

-visualizer_zlevel

Visualizer输出log文件的压缩级别(0=no compression, 9=max  compression)

-save_embedded_ptx

将二进制文件中的PTX保存为NaNx

-enable_ptx_file_line_stats  <0=off, 1=on (default)>

打开PTX源文件统计剖析功能

-ptx_line_stats_filename

指定PTX源文件统计剖析信息的输出文件

-gpgpu_warpdistro_shader

指定某个shader core收集warp size的分布情况

-gpgpu_cflog_interval

控制流记录器(logger)中每个快照(snopshot)的间隔

-keep

保存GPGPU-Sim产生的中间文件

High-Level Architecture Configuration (See ISPASS  paper for more details on what is being modeled)

Option

Description

-gpgpu_n_mem <# memory  controller>

DRAM控制器(DRAM通道)的数目。在进行这个设置前,请先阅读“#Topology Configuration”小节

-gpgpu_clock_domains :::

设置4个时钟域

-gpgpu_n_clusters

设置核心簇的数目

-gpgpu_n_cores_per_cluster

设置每个核心簇中SIMD核心的数目

Additional Architecture  Configuration

Option

Description

-gpgpu_n_cluster_ejection_buffer_size

Ejection buffer中包的数目

-gpgpu_n_ldst_response_buffer_size

LD/ST单元ejection buffer中响应包的数目

-gpgpu_coalesce_arch

合并架构(default = 13, anything else is off for now)

Scheduler

Option

Description

-gpgpu_num_sched_per_core

每个核心warp调度器的数目

-gpgpu_max_insn_issue_per_warp

每个cycle内每个warp所能发射的最大指令数

Shader Core Pipeline Configuration

Option

Description

-gpgpu_shader_core_pipeline <#  thread/shader core>::

Shader核心的流水线设置

-gpgpu_shader_registers <#  registers/shader core, default=8192>

每个shader核心的最大寄存器数目,被并发的CTA数目所限制

-gpgpu_shader_cta <# CTA/shader  core, default=8>

每个shader核心中能够并发的cta数目

-gpgpu_simd_model <1=immediate  post-dominator, others are not supported for now>          

SIMD分支分叉的处理策略

Memory Sub-System  Configuration

Option

Description

-gpgpu_perfect_mem <0=off  (default), 1=on>

开启完美存储器模式(不发生cache miss并且存储器延迟为“0”)

-gpgpu_tex_cache:l1  :::::,::,

纹理Cache配置。Evict policy: L = LRU, F = FIFO, R = Random

-gpgpu_const_cache:l1  :::::,::,

常量Cache配置。Evict policy: L = LRU, F = FIFO, R = Random

-gpgpu_cache:il1  :::::,::,

L1指令Cache配置。Evict policy: L = LRU, F = FIFO, R = Random

-gpgpu_cache:dl1  :::::,::,  -- set to "none" for no DL1 --

L1数据Cache配置。Evict policy: L = LRU, F = FIFO, R = Random

-gpgpu_cache:dl2  :::::,::,

统一的分bank的L2 Cache的配置。它指明了一个Memory Partion中L2 Cache bank的配置。L2 Cache的总容量 = x x x  <# memory controller>

-gpgpu_shmem_size

每个shader核心中共享memory的大小

-gpgpu_shmem_warp_parts

对于共享memory bank冲突检测,warp被划分的数目。

-gpgpu_flush_cache <0=off  (default), 1=on>

在每个kernel调用的结束阶段Flush Cache

-gpgpu_local_mem_map

从本地memory存储空间地址到GPU仿真的物理空间地址的映射(默认为开启)

-gpgpu_num_reg_banks

寄存器堆的bank数目

-gpgpu_reg_bank_use_warp_id

将寄存器映射为bank时使用warp id(默认为关闭)

-gpgpu_cache:dl2_texture_only

L2 Cache仅用于纹理(0=no, 1=yes, default=1)

Operand Collector Configuration

Option

Description

-gpgpu_operand_collector_num_units_sp

Collector  unit的数目。(默认 = 4)

-gpgpu_operand_collector_num_units_sfu

Collector  unit的数目。(默认 = 4)

-gpgpu_operand_collector_num_units_mem

Collector  unit的数目。(默认 = 2)

-gpgpu_operand_collector_num_units_gen

Collector  unit的数目。(默认 = 0)

-gpgpu_operand_collector_num_in_ports_sp

Collector  unit输入端口的数目(默认 = 1)

-gpgpu_operand_collector_num_in_ports_sfu

Collector  unit输入端口的数目(默认 = 1)

-gpgpu_operand_collector_num_in_ports_mem

Collector  unit输入端口的数目(默认 = 1)

-gpgpu_operand_collector_num_in_ports_gen

Collector unit输入端口的数目(默认 = 0)

-gpgpu_operand_collector_num_out_ports_sp

Collector unit输出端口的数目(默认 = 1)

-gpgpu_operand_collector_num_out_ports_sfu

Collector unit输出端口的数目(默认 = 1)

-gpgpu_operand_collector_num_out_ports_mem

Collector unit输出端口的数目(默认 = 1)

-gpgpu_operand_collector_num_out_ports_gen

Collector unit输出端口的数目(默认 = 0)

DRAM/Memory Controller  Configuration

Option

Description

-gpgpu_dram_scheduler <0 = fifo,  1 = fr-fcfs>

DRAM调度器的类型

-gpgpu_dram_sched_queue_size <#  entries>

DRAM调度对列的大小(0 = unlimited (default);  # entries per chip)

-gpgpu_dram_buswidth <# bytes/DRAM bus  cycle, default=4 bytes, i.e. 8 bytes/command clock cycle>

在command总线频率下一个DRAM芯片的总线带宽(default = 4 bytes (8 bytes  per command clock cycle))。每个MC的DRAM芯片数目由-gpgpu_n_mem_per_ctrlr选项确定。每个memory partition有(gpgpu_dram_buswidth X  gpgpu_n_mem_per_ctrlr)位DRAM数据pin脚。例如,Quadro FX5800有512位DRAM数据总线,被划分为8个memory partition。每个memory partition有一个512/8 = 64bit数据总线。64位总线被划分为两个DRAM芯片。每个芯片有32位 = 4字节DRAM总线宽度。因此设置-gpgpu_dram_buswidth为“4”。

-gpgpu_dram_timing_opt  

DRAM时序参数

-gpgpu_mem_address_mask

选择不同的地址译码策略对不同的memory bank进行访问。(0 = old addressing mask, 1 = new addressing mask, 2 =  new add. mask + flipped bank sel and chip sel bits)

-gpgpu_mem_addr_mapping dramid@;

将存储地址映射到DRAM模型:

l   = 用来指定DRAM通道ID的起始bit位(这意味着下Log2(#DRAM channel)bit位被用来作为DRAM通道ID,整个的地址映射被转换取决于有多少bit位被使用)

l   = 一个64个字符的字符串指名存储器地址中每一位是如何被映射为行(R),列(C),bank(B)地址的。部分处于DRAM突发中的地址应该用(S)指名

-gpgpu_n_mem_per_ctrlr <# DRAM  chips/memory controller>

每个MC中DRAM芯片的数量(即DRAM通道)

-gpgpu_dram_partition_queues

i2::2d:d2::2i

-rop_latency <# minimum cycle  before L2 cache access>

指定最小的延迟(以核心的时钟周期为单位)从一个存储请求到达memory partition到它访问L2 Cache/进入DRAM访问队列。它建模了最小的L2 Cache命中延迟。

-dram_latency <# minimum cycle  after L2 cache access and before DRAM access>

指定最小的延迟(以核心的时钟周期为单位)从一个存储请求访问L2 Cache到它被送入DRAM调度器。这个设置和-rop_latency一起建模最小的DRAM访问延迟(= rop_latency +  dram_latency)。

Interconnection  Configuration

Option

Description

-inter_config_file

这个文件包含了互连网络仿真器的设置

-network_mode

互连网络模型(默认 = 1)

PTX Configurations

Option

Description

-gpgpu_ptx_use_cuobjdump

使用cuobjdump抽取ptx/sass (0=no, 1=yes) 仅对CUDA 4.0有效。

-gpgpu_ptx_convert_to_ptxplus

将嵌入的ptx转化为ptxplus (0=no, 1=yes)

-gpgpu_ptx_save_converted_ptxplus

将转化的ptxplus保存到文件(0=no, 1=yes)

-gpgpu_ptx_force_max_capability

强迫使用最大计算能力 (默认为“0”)

-gpgpu_ptx_inst_debug_to_file

将执行指令的调试信息dump到文件(0=no, 1=yes)

-gpgpu_ptx_inst_debug_file

指定调试信息的输出文件

-gpgpu_ptx_inst_debug_thread_uid

指令调试信息的线程id UID

 

3.3.1Interconnection Configuration

   GPGPU-Sim 3.x使用booksim router simulator建模互连网络。可以参考booksim文档配置互连网络。然而,下面我们列出一些特殊的考虑需要被重视以确定你的修改可以和GPGPU-Sim一起工作。

 

3.3.1.1Topology Configuration

   注意,在互连网络配置文件中指定的网络节点总数目必须与GPGPU-Sim中的总节点数目相匹配。GPGPU-Sim的节点数目为SIMT核心簇数目与MC数目之和。如,QuadroFX5800配置中有10个SIMT核心簇和8个MC。因此一共有18个节点。因此,互连网络配置文件中也有18个节点,如下所示:

   topology = fly;

   k = 18;

   n = 1;

routing_function = dest_tag;

以上这个配置片断设置了一个一阶的蝶形互连网络,具有destination tag routing和18个节点。通常,蝶形和网状互连网络的网络节点总数应当是k*n。

注意,如果选择使用网状互连网络,你需要考虑配置MC的放置。在当前版本中,有一些预定义映射,可以通过设置“use_map=1;”开启。特别是ISPASS 2009文章中使用的网状互连网络可以通过这个进行设置,拓扑结构为:

l  a 6x6 mesh network(topology=mesh, k=6, n=2) : 28 SIMT cores + 8 dram channels assuming the SIMTcore Cluster size is one

   你可以创建自己的映射通过修改interconnect_interface.cpp中的create_node_map(),并设置use_map=1。

 

3.3.1.2Booksim options added by GPGPU-Sim

 

3.3.1.3Booksim Options ignored by GPGPU-Sim

   注意,下面booksim中配置选项要么被忽略或者保持默认状态不变。

l  Traffic Options:injection_rate,injection_process, burst_alpha, burst_beta, "const_flit_per_packet",traffic

l  Simulation parameters:sim_type, sample_period,warmup_periods, max_samples, latency_thres, sim_count, reorder

 



 

你可能感兴趣的:(GPU)