本文来自魏继增科学网博客:链接地址: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 |
显示流水线:显示编号为 |
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保存为 -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 L1数据Cache配置。Evict policy: L = LRU, F = FIFO, R = Random -gpgpu_cache:dl2 统一的分bank的L2 Cache的配置。它指明了一个Memory Partion中L2 Cache bank的配置。L2 Cache的总容量 = -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 l -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