summaryrefslogtreecommitdiff
path: root/src/gpgpu-sim/gpu-sim.cc
diff options
context:
space:
mode:
authorMahmoud <[email protected]>2020-05-23 20:06:25 -0400
committerMahmoud <[email protected]>2020-05-23 20:06:25 -0400
commitd610fd81420979e956bf37100f7e1c7f1d153831 (patch)
tree392a841f21fec5136339ff36ad9b5c7b1b4cb480 /src/gpgpu-sim/gpu-sim.cc
parent6cedd3ef4973f3785757413db89a7c5d0ee2b58b (diff)
parente9e9fcf5957530ecb927aecb5ea238e4b78a4f45 (diff)
Merge branch 'dev' of https://github.com/purdue-aalp/gpgpu-sim_distribution into dev-traces
Diffstat (limited to 'src/gpgpu-sim/gpu-sim.cc')
-rw-r--r--src/gpgpu-sim/gpu-sim.cc3172
1 files changed, 1651 insertions, 1521 deletions
diff --git a/src/gpgpu-sim/gpu-sim.cc b/src/gpgpu-sim/gpu-sim.cc
index 641ddbc..34bc7d9 100644
--- a/src/gpgpu-sim/gpu-sim.cc
+++ b/src/gpgpu-sim/gpu-sim.cc
@@ -8,70 +8,69 @@
//
// Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
-// Redistributions in binary form must reproduce the above copyright notice, this
-// list of conditions and the following disclaimer in the documentation and/or
-// other materials provided with the distribution.
-// Neither the name of The University of British Columbia nor the names of its
-// contributors may be used to endorse or promote products derived from this
-// software without specific prior written permission.
+// Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution. Neither the name of
+// The University of British Columbia nor the names of its contributors may be
+// used to endorse or promote products derived from this software without
+// specific prior written permission.
//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
#include "gpu-sim.h"
-#include <stdio.h>
-#include <stdlib.h>
#include <math.h>
#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
#include "zlib.h"
-
-#include "shader.h"
-#include "shader_trace.h"
#include "dram.h"
#include "mem_fetch.h"
+#include "shader.h"
+#include "shader_trace.h"
#include <time.h>
+#include "addrdec.h"
+#include "delayqueue.h"
+#include "dram.h"
#include "gpu-cache.h"
#include "gpu-misc.h"
-#include "delayqueue.h"
-#include "shader.h"
#include "icnt_wrapper.h"
-#include "dram.h"
-#include "addrdec.h"
-#include "stat-tool.h"
#include "l2cache.h"
+#include "shader.h"
+#include "stat-tool.h"
-#include "../cuda-sim/ptx-stats.h"
-#include "../statwrapper.h"
+#include "../../libcuda/gpgpu_context.h"
#include "../abstract_hardware_model.h"
-#include "../debug.h"
-#include "../gpgpusim_entrypoint.h"
#include "../cuda-sim/cuda-sim.h"
+#include "../cuda-sim/cuda_device_runtime.h"
+#include "../cuda-sim/ptx-stats.h"
#include "../cuda-sim/ptx_ir.h"
+#include "../debug.h"
+#include "../gpgpusim_entrypoint.h"
+#include "../statwrapper.h"
#include "../trace.h"
#include "mem_latency_stat.h"
#include "power_stat.h"
-#include "visualizer.h"
#include "stats.h"
-#include "../cuda-sim/cuda_device_runtime.h"
-#include "../../libcuda/gpgpu_context.h"
+#include "visualizer.h"
#include "../trace-driven/trace_driven.h"
#ifdef GPGPUSIM_POWER_MODEL
#include "power_interface.h"
#else
-class gpgpu_sim_wrapper {};
+class gpgpu_sim_wrapper {};
#endif
#include <stdio.h>
@@ -80,393 +79,438 @@ class gpgpu_sim_wrapper {};
#include <sstream>
#include <string>
-#define MAX(a,b) (((a)>(b))?(a):(b))
-
+#define MAX(a, b) (((a) > (b)) ? (a) : (b))
-bool g_interactive_debugger_enabled=false;
+bool g_interactive_debugger_enabled = false;
-tr1_hash_map<new_addr_type,unsigned> address_random_interleaving;
+tr1_hash_map<new_addr_type, unsigned> address_random_interleaving;
/* Clock Domains */
-#define CORE 0x01
-#define L2 0x02
-#define DRAM 0x04
-#define ICNT 0x08
-
+#define CORE 0x01
+#define L2 0x02
+#define DRAM 0x04
+#define ICNT 0x08
#define MEM_LATENCY_STAT_IMPL
-
#include "mem_latency_stat.h"
-void power_config::reg_options(class OptionParser * opp)
-{
+void power_config::reg_options(class OptionParser *opp) {
+ option_parser_register(opp, "-gpuwattch_xml_file", OPT_CSTR,
+ &g_power_config_name, "GPUWattch XML file",
+ "gpuwattch.xml");
+ option_parser_register(opp, "-power_simulation_enabled", OPT_BOOL,
+ &g_power_simulation_enabled,
+ "Turn on power simulator (1=On, 0=Off)", "0");
- option_parser_register(opp, "-gpuwattch_xml_file", OPT_CSTR,
- &g_power_config_name,"GPUWattch XML file",
- "gpuwattch.xml");
+ option_parser_register(opp, "-power_per_cycle_dump", OPT_BOOL,
+ &g_power_per_cycle_dump,
+ "Dump detailed power output each cycle", "0");
- option_parser_register(opp, "-power_simulation_enabled", OPT_BOOL,
- &g_power_simulation_enabled, "Turn on power simulator (1=On, 0=Off)",
- "0");
+ // Output Data Formats
+ option_parser_register(
+ opp, "-power_trace_enabled", OPT_BOOL, &g_power_trace_enabled,
+ "produce a file for the power trace (1=On, 0=Off)", "0");
- option_parser_register(opp, "-power_per_cycle_dump", OPT_BOOL,
- &g_power_per_cycle_dump, "Dump detailed power output each cycle",
- "0");
+ option_parser_register(
+ opp, "-power_trace_zlevel", OPT_INT32, &g_power_trace_zlevel,
+ "Compression level of the power trace output log (0=no comp, 9=highest)",
+ "6");
- // Output Data Formats
- option_parser_register(opp, "-power_trace_enabled", OPT_BOOL,
- &g_power_trace_enabled, "produce a file for the power trace (1=On, 0=Off)",
- "0");
-
- option_parser_register(opp, "-power_trace_zlevel", OPT_INT32,
- &g_power_trace_zlevel, "Compression level of the power trace output log (0=no comp, 9=highest)",
- "6");
-
- option_parser_register(opp, "-steady_power_levels_enabled", OPT_BOOL,
- &g_steady_power_levels_enabled, "produce a file for the steady power levels (1=On, 0=Off)",
- "0");
-
- option_parser_register(opp, "-steady_state_definition", OPT_CSTR,
- &gpu_steady_state_definition, "allowed deviation:number of samples",
- "8:4");
+ option_parser_register(
+ opp, "-steady_power_levels_enabled", OPT_BOOL,
+ &g_steady_power_levels_enabled,
+ "produce a file for the steady power levels (1=On, 0=Off)", "0");
+ option_parser_register(opp, "-steady_state_definition", OPT_CSTR,
+ &gpu_steady_state_definition,
+ "allowed deviation:number of samples", "8:4");
}
-void memory_config::reg_options(class OptionParser * opp)
-{
+void memory_config::reg_options(class OptionParser *opp) {
option_parser_register(opp, "-gpgpu_perf_sim_memcpy", OPT_BOOL, &m_perf_sim_memcpy,
- "Fill the L2 cache on memcpy", "1");
+ "Fill the L2 cache on memcpy", "1");
option_parser_register(opp, "-gpgpu_simple_dram_model", OPT_BOOL, &simple_dram_model,
- "simple_dram_model with fixed latency and BW", "0");
- option_parser_register(opp, "-gpgpu_dram_scheduler", OPT_INT32, &scheduler_type,
- "0 = fifo, 1 = FR-FCFS (defaul)", "1");
- option_parser_register(opp, "-gpgpu_dram_partition_queues", OPT_CSTR, &gpgpu_L2_queue_config,
- "i2$:$2d:d2$:$2i",
- "8:8:8:8");
+ "simple_dram_model with fixed latency and BW", "0");
+ option_parser_register(opp, "-gpgpu_dram_scheduler", OPT_INT32,
+ &scheduler_type, "0 = fifo, 1 = FR-FCFS (defaul)",
+ "1");
+ option_parser_register(opp, "-gpgpu_dram_partition_queues", OPT_CSTR,
+ &gpgpu_L2_queue_config, "i2$:$2d:d2$:$2i", "8:8:8:8");
- option_parser_register(opp, "-l2_ideal", OPT_BOOL, &l2_ideal,
- "Use a ideal L2 cache that always hit",
- "0");
- option_parser_register(opp, "-gpgpu_cache:dl2", OPT_CSTR, &m_L2_config.m_config_string,
- "unified banked L2 data cache config "
- " {<nsets>:<bsize>:<assoc>,<rep>:<wr>:<alloc>:<wr_alloc>,<mshr>:<N>:<merge>,<mq>}",
- "64:128:8,L:B:m:N,A:16:4,4");
- option_parser_register(opp, "-gpgpu_cache:dl2_texture_only", OPT_BOOL, &m_L2_texure_only,
- "L2 cache used for texture only",
- "1");
- option_parser_register(opp, "-gpgpu_n_mem", OPT_UINT32, &m_n_mem,
- "number of memory modules (e.g. memory controllers) in gpu",
- "8");
- option_parser_register(opp, "-gpgpu_n_sub_partition_per_mchannel", OPT_UINT32, &m_n_sub_partition_per_memory_channel,
- "number of memory subpartition in each memory module",
- "1");
- option_parser_register(opp, "-gpgpu_n_mem_per_ctrlr", OPT_UINT32, &gpu_n_mem_per_ctrlr,
- "number of memory chips per memory controller",
- "1");
- option_parser_register(opp, "-gpgpu_memlatency_stat", OPT_INT32, &gpgpu_memlatency_stat,
- "track and display latency statistics 0x2 enables MC, 0x4 enables queue logs",
- "0");
- option_parser_register(opp, "-gpgpu_frfcfs_dram_sched_queue_size", OPT_INT32, &gpgpu_frfcfs_dram_sched_queue_size,
- "0 = unlimited (default); # entries per chip",
- "0");
- option_parser_register(opp, "-gpgpu_dram_return_queue_size", OPT_INT32, &gpgpu_dram_return_queue_size,
- "0 = unlimited (default); # entries per chip",
- "0");
- option_parser_register(opp, "-gpgpu_dram_buswidth", OPT_UINT32, &busW,
- "default = 4 bytes (8 bytes per cycle at DDR)",
- "4");
- option_parser_register(opp, "-gpgpu_dram_burst_length", OPT_UINT32, &BL,
- "Burst length of each DRAM request (default = 4 data bus cycle)",
- "4");
- option_parser_register(opp, "-dram_data_command_freq_ratio", OPT_UINT32, &data_command_freq_ratio,
- "Frequency ratio between DRAM data bus and command bus (default = 2 times, i.e. DDR)",
- "2");
- option_parser_register(opp, "-gpgpu_dram_timing_opt", OPT_CSTR, &gpgpu_dram_timing_opt,
- "DRAM timing parameters = {nbk:tCCD:tRRD:tRCD:tRAS:tRP:tRC:CL:WL:tCDLR:tWR:nbkgrp:tCCDL:tRTPL}",
- "4:2:8:12:21:13:34:9:4:5:13:1:0:0");
+ option_parser_register(opp, "-l2_ideal", OPT_BOOL, &l2_ideal,
+ "Use a ideal L2 cache that always hit", "0");
+ option_parser_register(opp, "-gpgpu_cache:dl2", OPT_CSTR,
+ &m_L2_config.m_config_string,
+ "unified banked L2 data cache config "
+ " {<nsets>:<bsize>:<assoc>,<rep>:<wr>:<alloc>:<wr_"
+ "alloc>,<mshr>:<N>:<merge>,<mq>}",
+ "64:128:8,L:B:m:N,A:16:4,4");
+ option_parser_register(opp, "-gpgpu_cache:dl2_texture_only", OPT_BOOL,
+ &m_L2_texure_only, "L2 cache used for texture only",
+ "1");
+ option_parser_register(
+ opp, "-gpgpu_n_mem", OPT_UINT32, &m_n_mem,
+ "number of memory modules (e.g. memory controllers) in gpu", "8");
+ option_parser_register(opp, "-gpgpu_n_sub_partition_per_mchannel", OPT_UINT32,
+ &m_n_sub_partition_per_memory_channel,
+ "number of memory subpartition in each memory module",
+ "1");
+ option_parser_register(opp, "-gpgpu_n_mem_per_ctrlr", OPT_UINT32,
+ &gpu_n_mem_per_ctrlr,
+ "number of memory chips per memory controller", "1");
+ option_parser_register(opp, "-gpgpu_memlatency_stat", OPT_INT32,
+ &gpgpu_memlatency_stat,
+ "track and display latency statistics 0x2 enables MC, "
+ "0x4 enables queue logs",
+ "0");
+ option_parser_register(opp, "-gpgpu_frfcfs_dram_sched_queue_size", OPT_INT32,
+ &gpgpu_frfcfs_dram_sched_queue_size,
+ "0 = unlimited (default); # entries per chip", "0");
+ option_parser_register(opp, "-gpgpu_dram_return_queue_size", OPT_INT32,
+ &gpgpu_dram_return_queue_size,
+ "0 = unlimited (default); # entries per chip", "0");
+ option_parser_register(opp, "-gpgpu_dram_buswidth", OPT_UINT32, &busW,
+ "default = 4 bytes (8 bytes per cycle at DDR)", "4");
+ option_parser_register(
+ opp, "-gpgpu_dram_burst_length", OPT_UINT32, &BL,
+ "Burst length of each DRAM request (default = 4 data bus cycle)", "4");
+ option_parser_register(opp, "-dram_data_command_freq_ratio", OPT_UINT32,
+ &data_command_freq_ratio,
+ "Frequency ratio between DRAM data bus and command "
+ "bus (default = 2 times, i.e. DDR)",
+ "2");
+ option_parser_register(
+ opp, "-gpgpu_dram_timing_opt", OPT_CSTR, &gpgpu_dram_timing_opt,
+ "DRAM timing parameters = "
+ "{nbk:tCCD:tRRD:tRCD:tRAS:tRP:tRC:CL:WL:tCDLR:tWR:nbkgrp:tCCDL:tRTPL}",
+ "4:2:8:12:21:13:34:9:4:5:13:1:0:0");
option_parser_register(opp, "-gpgpu_l2_rop_latency", OPT_UINT32, &rop_latency,
- "ROP queue latency (default 85)",
- "85");
- option_parser_register(opp, "-dram_latency", OPT_UINT32, &dram_latency,
- "DRAM latency (default 30)",
- "30");
+ "ROP queue latency (default 85)", "85");
+ option_parser_register(opp, "-dram_latency", OPT_UINT32, &dram_latency,
+ "DRAM latency (default 30)", "30");
option_parser_register(opp, "-dram_dual_bus_interface", OPT_UINT32, &dual_bus_interface,
- "dual_bus_interface (default = 0) ",
- "0");
- option_parser_register(opp, "-dram_bnk_indexing_policy", OPT_UINT32, &dram_bnk_indexing_policy,
- "dram_bnk_indexing_policy (0 = normal indexing, 1 = Xoring with the higher bits) (Default = 0)",
- "0");
- option_parser_register(opp, "-dram_bnkgrp_indexing_policy", OPT_UINT32, &dram_bnkgrp_indexing_policy,
- "dram_bnkgrp_indexing_policy (0 = take higher bits, 1 = take lower bits) (Default = 0)",
- "0");
+ "dual_bus_interface (default = 0) ", "0");
+ option_parser_register(opp, "-dram_bnk_indexing_policy", OPT_UINT32,
+ &dram_bnk_indexing_policy,
+ "dram_bnk_indexing_policy (0 = normal indexing, 1 = "
+ "Xoring with the higher bits) (Default = 0)",
+ "0");
+ option_parser_register(opp, "-dram_bnkgrp_indexing_policy", OPT_UINT32,
+ &dram_bnkgrp_indexing_policy,
+ "dram_bnkgrp_indexing_policy (0 = take higher bits, 1 "
+ "= take lower bits) (Default = 0)",
+ "0");
option_parser_register(opp, "-dram_seperate_write_queue_enable", OPT_BOOL, &seperate_write_queue_enabled,
- "Seperate_Write_Queue_Enable",
- "0");
+ "Seperate_Write_Queue_Enable", "0");
option_parser_register(opp, "-dram_write_queue_size", OPT_CSTR, &write_queue_size_opt,
- "Write_Queue_Size",
- "32:28:16");
+ "Write_Queue_Size", "32:28:16");
option_parser_register(opp, "-dram_elimnate_rw_turnaround", OPT_BOOL, &elimnate_rw_turnaround,
- "elimnate_rw_turnaround i.e set tWTR and tRTW = 0",
- "0");
- option_parser_register(opp, "-icnt_flit_size", OPT_UINT32, &icnt_flit_size,
- "icnt_flit_size",
- "32");
- m_address_mapping.addrdec_setoption(opp);
+ "elimnate_rw_turnaround i.e set tWTR and tRTW = 0", "0");
+ option_parser_register(opp, "-icnt_flit_size", OPT_UINT32, &icnt_flit_size,
+ "icnt_flit_size", "32");
+ m_address_mapping.addrdec_setoption(opp);
}
-void shader_core_config::reg_options(class OptionParser * opp)
-{
- option_parser_register(opp, "-gpgpu_simd_model", OPT_INT32, &model,
- "1 = post-dominator", "1");
- option_parser_register(opp, "-gpgpu_shader_core_pipeline", OPT_CSTR, &gpgpu_shader_core_pipeline_opt,
- "shader core pipeline config, i.e., {<nthread>:<warpsize>}",
- "1024:32");
- option_parser_register(opp, "-gpgpu_tex_cache:l1", OPT_CSTR, &m_L1T_config.m_config_string,
- "per-shader L1 texture cache (READ-ONLY) config "
- " {<nsets>:<bsize>:<assoc>,<rep>:<wr>:<alloc>:<wr_alloc>,<mshr>:<N>:<merge>,<mq>:<rf>}",
- "8:128:5,L:R:m:N,F:128:4,128:2");
- option_parser_register(opp, "-gpgpu_const_cache:l1", OPT_CSTR, &m_L1C_config.m_config_string,
- "per-shader L1 constant memory cache (READ-ONLY) config "
- " {<nsets>:<bsize>:<assoc>,<rep>:<wr>:<alloc>:<wr_alloc>,<mshr>:<N>:<merge>,<mq>} ",
- "64:64:2,L:R:f:N,A:2:32,4" );
- option_parser_register(opp, "-gpgpu_cache:il1", OPT_CSTR, &m_L1I_config.m_config_string,
- "shader L1 instruction cache config "
- " {<nsets>:<bsize>:<assoc>,<rep>:<wr>:<alloc>:<wr_alloc>,<mshr>:<N>:<merge>,<mq>} ",
- "4:256:4,L:R:f:N,A:2:32,4" );
- option_parser_register(opp, "-gpgpu_cache:dl1", OPT_CSTR, &m_L1D_config.m_config_string,
- "per-shader L1 data cache config "
- " {<nsets>:<bsize>:<assoc>,<rep>:<wr>:<alloc>:<wr_alloc>,<mshr>:<N>:<merge>,<mq> | none}",
- "none" );
+void shader_core_config::reg_options(class OptionParser *opp) {
+ option_parser_register(opp, "-gpgpu_simd_model", OPT_INT32, &model,
+ "1 = post-dominator", "1");
+ option_parser_register(
+ opp, "-gpgpu_shader_core_pipeline", OPT_CSTR,
+ &gpgpu_shader_core_pipeline_opt,
+ "shader core pipeline config, i.e., {<nthread>:<warpsize>}", "1024:32");
+ option_parser_register(opp, "-gpgpu_tex_cache:l1", OPT_CSTR,
+ &m_L1T_config.m_config_string,
+ "per-shader L1 texture cache (READ-ONLY) config "
+ " {<nsets>:<bsize>:<assoc>,<rep>:<wr>:<alloc>:<wr_"
+ "alloc>,<mshr>:<N>:<merge>,<mq>:<rf>}",
+ "8:128:5,L:R:m:N,F:128:4,128:2");
+ option_parser_register(
+ opp, "-gpgpu_const_cache:l1", OPT_CSTR, &m_L1C_config.m_config_string,
+ "per-shader L1 constant memory cache (READ-ONLY) config "
+ " {<nsets>:<bsize>:<assoc>,<rep>:<wr>:<alloc>:<wr_alloc>,<mshr>:<N>:<"
+ "merge>,<mq>} ",
+ "64:64:2,L:R:f:N,A:2:32,4");
+ option_parser_register(opp, "-gpgpu_cache:il1", OPT_CSTR,
+ &m_L1I_config.m_config_string,
+ "shader L1 instruction cache config "
+ " {<nsets>:<bsize>:<assoc>,<rep>:<wr>:<alloc>:<wr_"
+ "alloc>,<mshr>:<N>:<merge>,<mq>} ",
+ "4:256:4,L:R:f:N,A:2:32,4");
+ option_parser_register(opp, "-gpgpu_cache:dl1", OPT_CSTR,
+ &m_L1D_config.m_config_string,
+ "per-shader L1 data cache config "
+ " {<nsets>:<bsize>:<assoc>,<rep>:<wr>:<alloc>:<wr_"
+ "alloc>,<mshr>:<N>:<merge>,<mq> | none}",
+ "none");
option_parser_register(opp, "-gpgpu_l1_banks", OPT_UINT32, &m_L1D_config.l1_banks,
- "The number of L1 cache banks",
- "1");
+ "The number of L1 cache banks", "1");
option_parser_register(opp, "-gpgpu_l1_latency", OPT_UINT32, &m_L1D_config.l1_latency,
- "L1 Hit Latency",
- "1");
+ "L1 Hit Latency", "1");
option_parser_register(opp, "-gpgpu_smem_latency", OPT_UINT32, &smem_latency,
- "smem Latency",
- "3");
- option_parser_register(opp, "-gpgpu_cache:dl1PrefL1", OPT_CSTR, &m_L1D_config.m_config_stringPrefL1,
- "per-shader L1 data cache config "
- " {<nsets>:<bsize>:<assoc>,<rep>:<wr>:<alloc>:<wr_alloc>,<mshr>:<N>:<merge>,<mq> | none}",
- "none" );
- option_parser_register(opp, "-gpgpu_cache:dl1PrefShared", OPT_CSTR, &m_L1D_config.m_config_stringPrefShared,
- "per-shader L1 data cache config "
- " {<nsets>:<bsize>:<assoc>,<rep>:<wr>:<alloc>:<wr_alloc>,<mshr>:<N>:<merge>,<mq> | none}",
- "none" );
+ "smem Latency", "3");
+ option_parser_register(opp, "-gpgpu_cache:dl1PrefL1", OPT_CSTR,
+ &m_L1D_config.m_config_stringPrefL1,
+ "per-shader L1 data cache config "
+ " {<nsets>:<bsize>:<assoc>,<rep>:<wr>:<alloc>:<wr_"
+ "alloc>,<mshr>:<N>:<merge>,<mq> | none}",
+ "none");
+ option_parser_register(opp, "-gpgpu_cache:dl1PrefShared", OPT_CSTR,
+ &m_L1D_config.m_config_stringPrefShared,
+ "per-shader L1 data cache config "
+ " {<nsets>:<bsize>:<assoc>,<rep>:<wr>:<alloc>:<wr_"
+ "alloc>,<mshr>:<N>:<merge>,<mq> | none}",
+ "none");
option_parser_register(opp, "-gpgpu_gmem_skip_L1D", OPT_BOOL, &gmem_skip_L1D,
- "global memory access skip L1D cache (implements -Xptxas -dlcm=cg, default=no skip)",
- "0");
+ "global memory access skip L1D cache (implements "
+ "-Xptxas -dlcm=cg, default=no skip)",
+ "0");
- option_parser_register(opp, "-gpgpu_perfect_mem", OPT_BOOL, &gpgpu_perfect_mem,
- "enable perfect memory mode (no cache miss)",
- "0");
- option_parser_register(opp, "-n_regfile_gating_group", OPT_UINT32, &n_regfile_gating_group,
- "group of lanes that should be read/written together)",
- "4");
- option_parser_register(opp, "-gpgpu_clock_gated_reg_file", OPT_BOOL, &gpgpu_clock_gated_reg_file,
- "enable clock gated reg file for power calculations",
- "0");
- option_parser_register(opp, "-gpgpu_clock_gated_lanes", OPT_BOOL, &gpgpu_clock_gated_lanes,
- "enable clock gated lanes for power calculations",
- "0");
- option_parser_register(opp, "-gpgpu_shader_registers", OPT_UINT32, &gpgpu_shader_registers,
- "Number of registers per shader core. Limits number of concurrent CTAs. (default 8192)",
- "8192");
- option_parser_register(opp, "-gpgpu_registers_per_block", OPT_UINT32, &gpgpu_registers_per_block,
- "Maximum number of registers per CTA. (default 8192)",
- "8192");
- option_parser_register(opp, "-gpgpu_ignore_resources_limitation", OPT_BOOL, &gpgpu_ignore_resources_limitation,
- "gpgpu_ignore_resources_limitation (default 0)",
- "0");
- option_parser_register(opp, "-gpgpu_shader_cta", OPT_UINT32, &max_cta_per_core,
- "Maximum number of concurrent CTAs in shader (default 8)",
- "8");
- option_parser_register(opp, "-gpgpu_num_cta_barriers", OPT_UINT32, &max_barriers_per_cta,
- "Maximum number of named barriers per CTA (default 16)",
- "16");
- option_parser_register(opp, "-gpgpu_n_clusters", OPT_UINT32, &n_simt_clusters,
- "number of processing clusters",
- "10");
- option_parser_register(opp, "-gpgpu_n_cores_per_cluster", OPT_UINT32, &n_simt_cores_per_cluster,
- "number of simd cores per cluster",
- "3");
- option_parser_register(opp, "-gpgpu_n_cluster_ejection_buffer_size", OPT_UINT32, &n_simt_ejection_buffer_size,
- "number of packets in ejection buffer",
- "8");
- option_parser_register(opp, "-gpgpu_n_ldst_response_buffer_size", OPT_UINT32, &ldst_unit_response_queue_size,
- "number of response packets in ld/st unit ejection buffer",
- "2");
- option_parser_register(opp, "-gpgpu_shmem_per_block", OPT_UINT32, &gpgpu_shmem_per_block,
- "Size of shared memory per thread block or CTA (default 48kB)",
- "49152");
- option_parser_register(opp, "-gpgpu_shmem_size", OPT_UINT32, &gpgpu_shmem_size,
- "Size of shared memory per shader core (default 16kB)",
- "16384");
+ option_parser_register(opp, "-gpgpu_perfect_mem", OPT_BOOL,
+ &gpgpu_perfect_mem,
+ "enable perfect memory mode (no cache miss)", "0");
+ option_parser_register(
+ opp, "-n_regfile_gating_group", OPT_UINT32, &n_regfile_gating_group,
+ "group of lanes that should be read/written together)", "4");
+ option_parser_register(
+ opp, "-gpgpu_clock_gated_reg_file", OPT_BOOL, &gpgpu_clock_gated_reg_file,
+ "enable clock gated reg file for power calculations", "0");
+ option_parser_register(
+ opp, "-gpgpu_clock_gated_lanes", OPT_BOOL, &gpgpu_clock_gated_lanes,
+ "enable clock gated lanes for power calculations", "0");
+ option_parser_register(opp, "-gpgpu_shader_registers", OPT_UINT32,
+ &gpgpu_shader_registers,
+ "Number of registers per shader core. Limits number "
+ "of concurrent CTAs. (default 8192)",
+ "8192");
+ option_parser_register(
+ opp, "-gpgpu_registers_per_block", OPT_UINT32, &gpgpu_registers_per_block,
+ "Maximum number of registers per CTA. (default 8192)", "8192");
+ option_parser_register(opp, "-gpgpu_ignore_resources_limitation", OPT_BOOL,
+ &gpgpu_ignore_resources_limitation,
+ "gpgpu_ignore_resources_limitation (default 0)", "0");
+ option_parser_register(
+ opp, "-gpgpu_shader_cta", OPT_UINT32, &max_cta_per_core,
+ "Maximum number of concurrent CTAs in shader (default 8)", "8");
+ option_parser_register(
+ opp, "-gpgpu_num_cta_barriers", OPT_UINT32, &max_barriers_per_cta,
+ "Maximum number of named barriers per CTA (default 16)", "16");
+ option_parser_register(opp, "-gpgpu_n_clusters", OPT_UINT32, &n_simt_clusters,
+ "number of processing clusters", "10");
+ option_parser_register(opp, "-gpgpu_n_cores_per_cluster", OPT_UINT32,
+ &n_simt_cores_per_cluster,
+ "number of simd cores per cluster", "3");
+ option_parser_register(opp, "-gpgpu_n_cluster_ejection_buffer_size",
+ OPT_UINT32, &n_simt_ejection_buffer_size,
+ "number of packets in ejection buffer", "8");
+ option_parser_register(
+ opp, "-gpgpu_n_ldst_response_buffer_size", OPT_UINT32,
+ &ldst_unit_response_queue_size,
+ "number of response packets in ld/st unit ejection buffer", "2");
+ option_parser_register(
+ opp, "-gpgpu_shmem_per_block", OPT_UINT32, &gpgpu_shmem_per_block,
+ "Size of shared memory per thread block or CTA (default 48kB)", "49152");
+ option_parser_register(
+ opp, "-gpgpu_shmem_size", OPT_UINT32, &gpgpu_shmem_size,
+ "Size of shared memory per shader core (default 16kB)", "16384");
option_parser_register(opp, "-gpgpu_adaptive_cache_config", OPT_UINT32, &adaptive_cache_config,
- "adaptive_cache_config",
- "0");
- option_parser_register(opp, "-gpgpu_shmem_sizeDefault", OPT_UINT32, &gpgpu_shmem_sizeDefault,
- "Size of shared memory per shader core (default 16kB)",
- "16384");
- option_parser_register(opp, "-gpgpu_shmem_size_PrefL1", OPT_UINT32, &gpgpu_shmem_sizePrefL1,
- "Size of shared memory per shader core (default 16kB)",
- "16384");
- option_parser_register(opp, "-gpgpu_shmem_size_PrefShared", OPT_UINT32, &gpgpu_shmem_sizePrefShared,
- "Size of shared memory per shader core (default 16kB)",
- "16384");
- option_parser_register(opp, "-gpgpu_shmem_num_banks", OPT_UINT32, &num_shmem_bank,
- "Number of banks in the shared memory in each shader core (default 16)",
- "16");
- option_parser_register(opp, "-gpgpu_shmem_limited_broadcast", OPT_BOOL, &shmem_limited_broadcast,
- "Limit shared memory to do one broadcast per cycle (default on)",
- "1");
- option_parser_register(opp, "-gpgpu_shmem_warp_parts", OPT_INT32, &mem_warp_parts,
- "Number of portions a warp is divided into for shared memory bank conflict check ",
- "2");
+ "adaptive_cache_config", "0");
+ option_parser_register(
+ opp, "-gpgpu_shmem_sizeDefault", OPT_UINT32, &gpgpu_shmem_sizeDefault,
+ "Size of shared memory per shader core (default 16kB)", "16384");
+ option_parser_register(
+ opp, "-gpgpu_shmem_size_PrefL1", OPT_UINT32, &gpgpu_shmem_sizePrefL1,
+ "Size of shared memory per shader core (default 16kB)", "16384");
+ option_parser_register(opp, "-gpgpu_shmem_size_PrefShared", OPT_UINT32,
+ &gpgpu_shmem_sizePrefShared,
+ "Size of shared memory per shader core (default 16kB)",
+ "16384");
+ option_parser_register(
+ opp, "-gpgpu_shmem_num_banks", OPT_UINT32, &num_shmem_bank,
+ "Number of banks in the shared memory in each shader core (default 16)",
+ "16");
+ option_parser_register(
+ opp, "-gpgpu_shmem_limited_broadcast", OPT_BOOL, &shmem_limited_broadcast,
+ "Limit shared memory to do one broadcast per cycle (default on)", "1");
+ option_parser_register(opp, "-gpgpu_shmem_warp_parts", OPT_INT32,
+ &mem_warp_parts,
+ "Number of portions a warp is divided into for shared "
+ "memory bank conflict check ",
+ "2");
option_parser_register(opp, "-gpgpu_mem_unit_ports", OPT_INT32, &mem_unit_ports,
- "The number of memory transactions allowed per core cycle",
- "1");
- option_parser_register(opp, "-gpgpu_shmem_warp_parts", OPT_INT32, &mem_warp_parts,
- "Number of portions a warp is divided into for shared memory bank conflict check ",
- "2");
- option_parser_register(opp, "-gpgpu_warpdistro_shader", OPT_INT32, &gpgpu_warpdistro_shader,
- "Specify which shader core to collect the warp size distribution from",
- "-1");
- option_parser_register(opp, "-gpgpu_warp_issue_shader", OPT_INT32, &gpgpu_warp_issue_shader,
- "Specify which shader core to collect the warp issue distribution from",
- "0");
- option_parser_register(opp, "-gpgpu_local_mem_map", OPT_BOOL, &gpgpu_local_mem_map,
- "Mapping from local memory space address to simulated GPU physical address space (default = enabled)",
- "1");
- option_parser_register(opp, "-gpgpu_num_reg_banks", OPT_INT32, &gpgpu_num_reg_banks,
- "Number of register banks (default = 8)",
- "8");
- option_parser_register(opp, "-gpgpu_reg_bank_use_warp_id", OPT_BOOL, &gpgpu_reg_bank_use_warp_id,
- "Use warp ID in mapping registers to banks (default = off)",
- "0");
+ "The number of memory transactions allowed per core cycle", "1");
+ option_parser_register(opp, "-gpgpu_shmem_warp_parts", OPT_INT32,
+ &mem_warp_parts,
+ "Number of portions a warp is divided into for shared "
+ "memory bank conflict check ",
+ "2");
+ option_parser_register(
+ opp, "-gpgpu_warpdistro_shader", OPT_INT32, &gpgpu_warpdistro_shader,
+ "Specify which shader core to collect the warp size distribution from",
+ "-1");
+ option_parser_register(
+ opp, "-gpgpu_warp_issue_shader", OPT_INT32, &gpgpu_warp_issue_shader,
+ "Specify which shader core to collect the warp issue distribution from",
+ "0");
+ option_parser_register(opp, "-gpgpu_local_mem_map", OPT_BOOL,
+ &gpgpu_local_mem_map,
+ "Mapping from local memory space address to simulated "
+ "GPU physical address space (default = enabled)",
+ "1");
+ option_parser_register(opp, "-gpgpu_num_reg_banks", OPT_INT32,
+ &gpgpu_num_reg_banks,
+ "Number of register banks (default = 8)", "8");
+ option_parser_register(
+ opp, "-gpgpu_reg_bank_use_warp_id", OPT_BOOL, &gpgpu_reg_bank_use_warp_id,
+ "Use warp ID in mapping registers to banks (default = off)", "0");
option_parser_register(opp, "-gpgpu_sub_core_model", OPT_BOOL, &sub_core_model,
- "Sub Core Volta/Pascal model (default = off)",
- "0");
- option_parser_register(opp, "-gpgpu_enable_specialized_operand_collector", OPT_BOOL, &enable_specialized_operand_collector,
- "enable_specialized_operand_collector",
- "1");
- option_parser_register(opp, "-gpgpu_operand_collector_num_units_sp", OPT_INT32, &gpgpu_operand_collector_num_units_sp,
- "number of collector units (default = 4)",
- "4");
- option_parser_register(opp, "-gpgpu_operand_collector_num_units_dp", OPT_INT32, &gpgpu_operand_collector_num_units_dp,
- "number of collector units (default = 0)",
- "0");
- option_parser_register(opp, "-gpgpu_operand_collector_num_units_sfu", OPT_INT32, &gpgpu_operand_collector_num_units_sfu,
- "number of collector units (default = 4)",
- "4");
- option_parser_register(opp, "-gpgpu_operand_collector_num_units_int", OPT_INT32, &gpgpu_operand_collector_num_units_int,
- "number of collector units (default = 0)",
- "0");
- option_parser_register(opp, "-gpgpu_operand_collector_num_units_tensor_core", OPT_INT32, &gpgpu_operand_collector_num_units_tensor_core,
- "number of collector units (default = 4)",
- "4");
- option_parser_register(opp, "-gpgpu_operand_collector_num_units_mem", OPT_INT32, &gpgpu_operand_collector_num_units_mem,
- "number of collector units (default = 2)",
- "2");
- option_parser_register(opp, "-gpgpu_operand_collector_num_units_gen", OPT_INT32, &gpgpu_operand_collector_num_units_gen,
- "number of collector units (default = 0)",
- "0");
- option_parser_register(opp, "-gpgpu_operand_collector_num_in_ports_sp", OPT_INT32, &gpgpu_operand_collector_num_in_ports_sp,
- "number of collector unit in ports (default = 1)",
- "1");
- option_parser_register(opp, "-gpgpu_operand_collector_num_in_ports_dp", OPT_INT32, &gpgpu_operand_collector_num_in_ports_dp,
- "number of collector unit in ports (default = 0)",
- "0");
- option_parser_register(opp, "-gpgpu_operand_collector_num_in_ports_sfu", OPT_INT32, &gpgpu_operand_collector_num_in_ports_sfu,
- "number of collector unit in ports (default = 1)",
- "1");
- option_parser_register(opp, "-gpgpu_operand_collector_num_in_ports_int", OPT_INT32, &gpgpu_operand_collector_num_in_ports_int,
- "number of collector unit in ports (default = 0)",
- "0");
- option_parser_register(opp, "-gpgpu_operand_collector_num_in_ports_tensor_core", OPT_INT32, &gpgpu_operand_collector_num_in_ports_tensor_core,
- "number of collector unit in ports (default = 1)",
- "1");
- option_parser_register(opp, "-gpgpu_operand_collector_num_in_ports_mem", OPT_INT32, &gpgpu_operand_collector_num_in_ports_mem,
- "number of collector unit in ports (default = 1)",
- "1");
- option_parser_register(opp, "-gpgpu_operand_collector_num_in_ports_gen", OPT_INT32, &gpgpu_operand_collector_num_in_ports_gen,
- "number of collector unit in ports (default = 0)",
- "0");
- option_parser_register(opp, "-gpgpu_operand_collector_num_out_ports_sp", OPT_INT32, &gpgpu_operand_collector_num_out_ports_sp,
- "number of collector unit in ports (default = 1)",
- "1");
- option_parser_register(opp, "-gpgpu_operand_collector_num_out_ports_dp", OPT_INT32, &gpgpu_operand_collector_num_out_ports_dp,
- "number of collector unit in ports (default = 0)",
- "0");
- option_parser_register(opp, "-gpgpu_operand_collector_num_out_ports_sfu", OPT_INT32, &gpgpu_operand_collector_num_out_ports_sfu,
- "number of collector unit in ports (default = 1)",
- "1");
- option_parser_register(opp, "-gpgpu_operand_collector_num_out_ports_int", OPT_INT32, &gpgpu_operand_collector_num_out_ports_int,
- "number of collector unit in ports (default = 0)",
- "0");
- option_parser_register(opp, "-gpgpu_operand_collector_num_out_ports_tensor_core", OPT_INT32, &gpgpu_operand_collector_num_out_ports_tensor_core,
- "number of collector unit in ports (default = 1)",
- "1");
- option_parser_register(opp, "-gpgpu_operand_collector_num_out_ports_mem", OPT_INT32, &gpgpu_operand_collector_num_out_ports_mem,
- "number of collector unit in ports (default = 1)",
- "1");
- option_parser_register(opp, "-gpgpu_operand_collector_num_out_ports_gen", OPT_INT32, &gpgpu_operand_collector_num_out_ports_gen,
- "number of collector unit in ports (default = 0)",
- "0");
- option_parser_register(opp, "-gpgpu_coalesce_arch", OPT_INT32, &gpgpu_coalesce_arch,
- "Coalescing arch (GT200 = 13, Fermi = 20)",
- "13");
- option_parser_register(opp, "-gpgpu_num_sched_per_core", OPT_INT32, &gpgpu_num_sched_per_core,
- "Number of warp schedulers per core",
- "1");
- option_parser_register(opp, "-gpgpu_max_insn_issue_per_warp", OPT_INT32, &gpgpu_max_insn_issue_per_warp,
- "Max number of instructions that can be issued per warp in one cycle by scheduler (either 1 or 2)",
- "2");
- option_parser_register(opp, "-gpgpu_dual_issue_diff_exec_units", OPT_BOOL, &gpgpu_dual_issue_diff_exec_units,
- "should dual issue use two different execution unit resources (Default = 1)",
- "1");
- option_parser_register(opp, "-gpgpu_simt_core_sim_order", OPT_INT32, &simt_core_sim_order,
- "Select the simulation order of cores in a cluster (0=Fix, 1=Round-Robin)",
- "1");
- option_parser_register(opp, "-gpgpu_pipeline_widths", OPT_CSTR, &pipeline_widths_string,
- "Pipeline widths "
- "ID_OC_SP,ID_OC_DP,ID_OC_INT,ID_OC_SFU,ID_OC_MEM,OC_EX_SP,OC_EX_DP,OC_EX_INT,OC_EX_SFU,OC_EX_MEM,EX_WB,ID_OC_TENSOR_CORE,OC_EX_TENSOR_CORE",
- "1,1,1,1,1,1,1,1,1,1,1,1,1" );
- option_parser_register(opp, "-gpgpu_tensor_core_avail", OPT_INT32, &gpgpu_tensor_core_avail,
- "Tensor Core Available (default=0)",
- "0");
- option_parser_register(opp, "-gpgpu_num_sp_units", OPT_INT32, &gpgpu_num_sp_units,
- "Number of SP units (default=1)",
- "1");
- option_parser_register(opp, "-gpgpu_num_dp_units", OPT_INT32, &gpgpu_num_dp_units,
- "Number of DP units (default=0)",
- "0");
- option_parser_register(opp, "-gpgpu_num_int_units", OPT_INT32, &gpgpu_num_int_units,
- "Number of INT units (default=0)",
- "0");
- option_parser_register(opp, "-gpgpu_num_sfu_units", OPT_INT32, &gpgpu_num_sfu_units,
- "Number of SF units (default=1)",
- "1");
- option_parser_register(opp, "-gpgpu_num_tensor_core_units", OPT_INT32, &gpgpu_num_tensor_core_units,
+ "Sub Core Volta/Pascal model (default = off)", "0");
+ option_parser_register(opp, "-gpgpu_enable_specialized_operand_collector", OPT_BOOL,
+ &enable_specialized_operand_collector,
+ "enable_specialized_operand_collector", "1");
+ option_parser_register(opp, "-gpgpu_operand_collector_num_units_sp",
+ OPT_INT32, &gpgpu_operand_collector_num_units_sp,
+ "number of collector units (default = 4)", "4");
+ option_parser_register(opp, "-gpgpu_operand_collector_num_units_dp",
+ OPT_INT32, &gpgpu_operand_collector_num_units_dp,
+ "number of collector units (default = 0)", "0");
+ option_parser_register(opp, "-gpgpu_operand_collector_num_units_sfu",
+ OPT_INT32, &gpgpu_operand_collector_num_units_sfu,
+ "number of collector units (default = 4)", "4");
+ option_parser_register(opp, "-gpgpu_operand_collector_num_units_int",
+ OPT_INT32, &gpgpu_operand_collector_num_units_int,
+ "number of collector units (default = 0)", "0");
+ option_parser_register(opp, "-gpgpu_operand_collector_num_units_tensor_core",
+ OPT_INT32,
+ &gpgpu_operand_collector_num_units_tensor_core,
+ "number of collector units (default = 4)", "4");
+ option_parser_register(opp, "-gpgpu_operand_collector_num_units_mem",
+ OPT_INT32, &gpgpu_operand_collector_num_units_mem,
+ "number of collector units (default = 2)", "2");
+ option_parser_register(opp, "-gpgpu_operand_collector_num_units_gen",
+ OPT_INT32, &gpgpu_operand_collector_num_units_gen,
+ "number of collector units (default = 0)", "0");
+ option_parser_register(opp, "-gpgpu_operand_collector_num_in_ports_sp",
+ OPT_INT32, &gpgpu_operand_collector_num_in_ports_sp,
+ "number of collector unit in ports (default = 1)",
+ "1");
+ option_parser_register(opp, "-gpgpu_operand_collector_num_in_ports_dp",
+ OPT_INT32, &gpgpu_operand_collector_num_in_ports_dp,
+ "number of collector unit in ports (default = 0)",
+ "0");
+ option_parser_register(opp, "-gpgpu_operand_collector_num_in_ports_sfu",
+ OPT_INT32, &gpgpu_operand_collector_num_in_ports_sfu,
+ "number of collector unit in ports (default = 1)",
+ "1");
+ option_parser_register(opp, "-gpgpu_operand_collector_num_in_ports_int",
+ OPT_INT32, &gpgpu_operand_collector_num_in_ports_int,
+ "number of collector unit in ports (default = 0)",
+ "0");
+ option_parser_register(
+ opp, "-gpgpu_operand_collector_num_in_ports_tensor_core", OPT_INT32,
+ &gpgpu_operand_collector_num_in_ports_tensor_core,
+ "number of collector unit in ports (default = 1)", "1");
+ option_parser_register(opp, "-gpgpu_operand_collector_num_in_ports_mem",
+ OPT_INT32, &gpgpu_operand_collector_num_in_ports_mem,
+ "number of collector unit in ports (default = 1)",
+ "1");
+ option_parser_register(opp, "-gpgpu_operand_collector_num_in_ports_gen",
+ OPT_INT32, &gpgpu_operand_collector_num_in_ports_gen,
+ "number of collector unit in ports (default = 0)",
+ "0");
+ option_parser_register(opp, "-gpgpu_operand_collector_num_out_ports_sp",
+ OPT_INT32, &gpgpu_operand_collector_num_out_ports_sp,
+ "number of collector unit in ports (default = 1)",
+ "1");
+ option_parser_register(opp, "-gpgpu_operand_collector_num_out_ports_dp",
+ OPT_INT32, &gpgpu_operand_collector_num_out_ports_dp,
+ "number of collector unit in ports (default = 0)",
+ "0");
+ option_parser_register(opp, "-gpgpu_operand_collector_num_out_ports_sfu",
+ OPT_INT32, &gpgpu_operand_collector_num_out_ports_sfu,
+ "number of collector unit in ports (default = 1)",
+ "1");
+ option_parser_register(opp, "-gpgpu_operand_collector_num_out_ports_int",
+ OPT_INT32, &gpgpu_operand_collector_num_out_ports_int,
+ "number of collector unit in ports (default = 0)",
+ "0");
+ option_parser_register(
+ opp, "-gpgpu_operand_collector_num_out_ports_tensor_core", OPT_INT32,
+ &gpgpu_operand_collector_num_out_ports_tensor_core,
+ "number of collector unit in ports (default = 1)", "1");
+ option_parser_register(opp, "-gpgpu_operand_collector_num_out_ports_mem",
+ OPT_INT32, &gpgpu_operand_collector_num_out_ports_mem,
+ "number of collector unit in ports (default = 1)",
+ "1");
+ option_parser_register(opp, "-gpgpu_operand_collector_num_out_ports_gen",
+ OPT_INT32, &gpgpu_operand_collector_num_out_ports_gen,
+ "number of collector unit in ports (default = 0)",
+ "0");
+ option_parser_register(opp, "-gpgpu_coalesce_arch", OPT_INT32,
+ &gpgpu_coalesce_arch,
+ "Coalescing arch (GT200 = 13, Fermi = 20)", "13");
+ option_parser_register(opp, "-gpgpu_num_sched_per_core", OPT_INT32,
+ &gpgpu_num_sched_per_core,
+ "Number of warp schedulers per core", "1");
+ option_parser_register(opp, "-gpgpu_max_insn_issue_per_warp", OPT_INT32,
+ &gpgpu_max_insn_issue_per_warp,
+ "Max number of instructions that can be issued per "
+ "warp in one cycle by scheduler (either 1 or 2)",
+ "2");
+ option_parser_register(opp, "-gpgpu_dual_issue_diff_exec_units", OPT_BOOL,
+ &gpgpu_dual_issue_diff_exec_units,
+ "should dual issue use two different execution unit "
+ "resources (Default = 1)",
+ "1");
+ option_parser_register(opp, "-gpgpu_simt_core_sim_order", OPT_INT32,
+ &simt_core_sim_order,
+ "Select the simulation order of cores in a cluster "
+ "(0=Fix, 1=Round-Robin)",
+ "1");
+ option_parser_register(
+ opp, "-gpgpu_pipeline_widths", OPT_CSTR, &pipeline_widths_string,
+ "Pipeline widths "
+ "ID_OC_SP,ID_OC_DP,ID_OC_INT,ID_OC_SFU,ID_OC_MEM,OC_EX_SP,OC_EX_DP,OC_EX_"
+ "INT,OC_EX_SFU,OC_EX_MEM,EX_WB,ID_OC_TENSOR_CORE,OC_EX_TENSOR_CORE",
+ "1,1,1,1,1,1,1,1,1,1,1,1,1");
+ option_parser_register(opp, "-gpgpu_tensor_core_avail", OPT_INT32,
+ &gpgpu_tensor_core_avail,
+ "Tensor Core Available (default=0)", "0");
+ option_parser_register(opp, "-gpgpu_num_sp_units", OPT_INT32,
+ &gpgpu_num_sp_units, "Number of SP units (default=1)",
+ "1");
+ option_parser_register(opp, "-gpgpu_num_dp_units", OPT_INT32,
+ &gpgpu_num_dp_units, "Number of DP units (default=0)",
+ "0");
+ option_parser_register(opp, "-gpgpu_num_int_units", OPT_INT32,
+ &gpgpu_num_int_units,
+ "Number of INT units (default=0)", "0");
+ option_parser_register(opp, "-gpgpu_num_sfu_units", OPT_INT32,
+ &gpgpu_num_sfu_units, "Number of SF units (default=1)",
+ "1");
+ option_parser_register(opp, "-gpgpu_num_tensor_core_units", OPT_INT32,
+ &gpgpu_num_tensor_core_units,
"Number of tensor_core units (default=1)",
"0");
- option_parser_register(opp, "-gpgpu_num_mem_units", OPT_INT32, &gpgpu_num_mem_units,
- "Number if ldst units (default=1) WARNING: not hooked up to anything",
- "1");
- option_parser_register(opp, "-gpgpu_scheduler", OPT_CSTR, &gpgpu_scheduler_string,
- "Scheduler configuration: < lrr | gto | two_level_active > "
- "If two_level_active:<num_active_warps>:<inner_prioritization>:<outer_prioritization>"
- "For complete list of prioritization values see shader.h enum scheduler_prioritization_type"
- "Default: gto",
- "gto");
+ option_parser_register(opp, "-gpgpu_num_mem_units", OPT_INT32, &gpgpu_num_mem_units,
+ "Number if ldst units (default=1) WARNING: not hooked up to anything",
+ "1");
+ option_parser_register(
+ opp, "-gpgpu_scheduler", OPT_CSTR, &gpgpu_scheduler_string,
+ "Scheduler configuration: < lrr | gto | two_level_active > "
+ "If "
+ "two_level_active:<num_active_warps>:<inner_prioritization>:<outer_"
+ "prioritization>"
+ "For complete list of prioritization values see shader.h enum "
+ "scheduler_prioritization_type"
+ "Default: gto",
+ "gto");
- option_parser_register(opp, "-gpgpu_concurrent_kernel_sm", OPT_BOOL, &gpgpu_concurrent_kernel_sm,
- "Support concurrent kernels on a SM (default = disabled)",
- "0");
+ option_parser_register(
+ opp, "-gpgpu_concurrent_kernel_sm", OPT_BOOL, &gpgpu_concurrent_kernel_sm,
+ "Support concurrent kernels on a SM (default = disabled)", "0");
option_parser_register(opp, "-gpgpu_perfect_inst_const_cache", OPT_BOOL, &perfect_inst_const_cache,
"perfect inst and const cache mode, so all inst and const hits in the cache(default = disabled)",
"0");
@@ -476,7 +520,6 @@ void shader_core_config::reg_options(class OptionParser * opp)
option_parser_register(opp, "-gpgpu_reg_file_port_throughput", OPT_INT32, &reg_file_port_throughput,
"the number ports of the register file",
"1");
-
//used for trace-driven mode
option_parser_register(opp, "-trace_opcode_latency_initiation_int", OPT_CSTR, &trace_opcode_latency_initiation_int,
"Opcode latencies and initiation for integers in trace driven mode <latency,initiation>",
@@ -495,97 +538,109 @@ void shader_core_config::reg_options(class OptionParser * opp)
"4,1");
}
-void gpgpu_sim_config::reg_options(option_parser_t opp)
-{
- gpgpu_functional_sim_config::reg_options(opp);
- m_shader_config.reg_options(opp);
- m_memory_config.reg_options(opp);
- power_config::reg_options(opp);
- option_parser_register(opp, "-gpgpu_max_cycle", OPT_INT64, &gpu_max_cycle_opt,
- "terminates gpu simulation early (0 = no limit)",
- "0");
- option_parser_register(opp, "-gpgpu_max_insn", OPT_INT64, &gpu_max_insn_opt,
- "terminates gpu simulation early (0 = no limit)",
- "0");
- option_parser_register(opp, "-gpgpu_max_cta", OPT_INT32, &gpu_max_cta_opt,
- "terminates gpu simulation early (0 = no limit)",
- "0");
- option_parser_register(opp, "-gpgpu_runtime_stat", OPT_CSTR, &gpgpu_runtime_stat,
- "display runtime statistics such as dram utilization {<freq>:<flag>}",
- "10000:0");
- option_parser_register(opp, "-liveness_message_freq", OPT_INT64, &liveness_message_freq,
- "Minimum number of seconds between simulation liveness messages (0 = always print)",
- "1");
- option_parser_register(opp, "-gpgpu_compute_capability_major", OPT_UINT32, &gpgpu_compute_capability_major,
- "Major compute capability version number",
- "7");
- option_parser_register(opp, "-gpgpu_compute_capability_minor", OPT_UINT32, &gpgpu_compute_capability_minor,
- "Minor compute capability version number",
- "0");
- option_parser_register(opp, "-gpgpu_flush_l1_cache", OPT_BOOL, &gpgpu_flush_l1_cache,
- "Flush L1 cache at the end of each kernel call",
- "0");
- option_parser_register(opp, "-gpgpu_flush_l2_cache", OPT_BOOL, &gpgpu_flush_l2_cache,
- "Flush L2 cache at the end of each kernel call",
- "0");
- option_parser_register(opp, "-gpgpu_deadlock_detect", OPT_BOOL, &gpu_deadlock_detect,
- "Stop the simulation at deadlock (1=on (default), 0=off)",
- "1");
- option_parser_register(opp, "-gpgpu_ptx_instruction_classification", OPT_INT32,
- &(gpgpu_ctx->func_sim->gpgpu_ptx_instruction_classification),
- "if enabled will classify ptx instruction types per kernel (Max 255 kernels now)",
- "0");
- option_parser_register(opp, "-gpgpu_ptx_sim_mode", OPT_INT32, &(gpgpu_ctx->func_sim->g_ptx_sim_mode),
- "Select between Performance (default) or Functional simulation (1)",
- "0");
- option_parser_register(opp, "-gpgpu_clock_domains", OPT_CSTR, &gpgpu_clock_domains,
- "Clock Domain Frequencies in MhZ {<Core Clock>:<ICNT Clock>:<L2 Clock>:<DRAM Clock>}",
- "500.0:2000.0:2000.0:2000.0");
- option_parser_register(opp, "-gpgpu_max_concurrent_kernel", OPT_INT32, &max_concurrent_kernel,
- "maximum kernels that can run concurrently on GPU", "8" );
- option_parser_register(opp, "-gpgpu_cflog_interval", OPT_INT32, &gpgpu_cflog_interval,
- "Interval between each snapshot in control flow logger",
- "0");
- option_parser_register(opp, "-visualizer_enabled", OPT_BOOL,
- &g_visualizer_enabled, "Turn on visualizer output (1=On, 0=Off)",
- "1");
- option_parser_register(opp, "-visualizer_outputfile", OPT_CSTR,
- &g_visualizer_filename, "Specifies the output log file for visualizer",
- NULL);
- option_parser_register(opp, "-visualizer_zlevel", OPT_INT32,
- &g_visualizer_zlevel, "Compression level of the visualizer output log (0=no comp, 9=highest)",
- "6");
- option_parser_register(opp, "-gpgpu_stack_size_limit", OPT_INT32, &stack_size_limit,
- "GPU thread stack size", "1024" );
- option_parser_register(opp, "-gpgpu_heap_size_limit", OPT_INT32, &heap_size_limit,
- "GPU malloc heap size ", "8388608" );
- option_parser_register(opp, "-gpgpu_runtime_sync_depth_limit", OPT_INT32, &runtime_sync_depth_limit,
- "GPU device runtime synchronize depth", "2" );
- option_parser_register(opp, "-gpgpu_runtime_pending_launch_count_limit", OPT_INT32, &runtime_pending_launch_count_limit,
- "GPU device runtime pending launch count", "2048" );
- option_parser_register(opp, "-trace_enabled", OPT_BOOL,
- &Trace::enabled, "Turn on traces",
- "0");
- option_parser_register(opp, "-trace_components", OPT_CSTR,
- &Trace::config_str, "comma seperated list of traces to enable. "
- "Complete list found in trace_streams.tup. "
- "Default none",
- "none");
- option_parser_register(opp, "-trace_sampling_core", OPT_INT32,
- &Trace::sampling_core, "The core which is printed using CORE_DPRINTF. Default 0",
- "0");
- option_parser_register(opp, "-trace_sampling_memory_partition", OPT_INT32,
- &Trace::sampling_memory_partition, "The memory partition which is printed using MEMPART_DPRINTF. Default -1 (i.e. all)",
- "-1");
- gpgpu_ctx->stats->ptx_file_line_stats_options(opp);
+void gpgpu_sim_config::reg_options(option_parser_t opp) {
+ gpgpu_functional_sim_config::reg_options(opp);
+ m_shader_config.reg_options(opp);
+ m_memory_config.reg_options(opp);
+ power_config::reg_options(opp);
+ option_parser_register(opp, "-gpgpu_max_cycle", OPT_INT64, &gpu_max_cycle_opt,
+ "terminates gpu simulation early (0 = no limit)", "0");
+ option_parser_register(opp, "-gpgpu_max_insn", OPT_INT64, &gpu_max_insn_opt,
+ "terminates gpu simulation early (0 = no limit)", "0");
+ option_parser_register(opp, "-gpgpu_max_cta", OPT_INT32, &gpu_max_cta_opt,
+ "terminates gpu simulation early (0 = no limit)", "0");
+ option_parser_register(opp, "-gpgpu_max_completed_cta", OPT_INT32,
+ &gpu_max_completed_cta_opt,
+ "terminates gpu simulation early (0 = no limit)", "0");
+ option_parser_register(
+ opp, "-gpgpu_runtime_stat", OPT_CSTR, &gpgpu_runtime_stat,
+ "display runtime statistics such as dram utilization {<freq>:<flag>}",
+ "10000:0");
+ option_parser_register(opp, "-liveness_message_freq", OPT_INT64,
+ &liveness_message_freq,
+ "Minimum number of seconds between simulation "
+ "liveness messages (0 = always print)",
+ "1");
+ option_parser_register(opp, "-gpgpu_compute_capability_major", OPT_UINT32,
+ &gpgpu_compute_capability_major,
+ "Major compute capability version number", "7");
+ option_parser_register(opp, "-gpgpu_compute_capability_minor", OPT_UINT32,
+ &gpgpu_compute_capability_minor,
+ "Minor compute capability version number", "0");
+ option_parser_register(opp, "-gpgpu_flush_l1_cache", OPT_BOOL,
+ &gpgpu_flush_l1_cache,
+ "Flush L1 cache at the end of each kernel call", "0");
+ option_parser_register(opp, "-gpgpu_flush_l2_cache", OPT_BOOL,
+ &gpgpu_flush_l2_cache,
+ "Flush L2 cache at the end of each kernel call", "0");
+ option_parser_register(
+ opp, "-gpgpu_deadlock_detect", OPT_BOOL, &gpu_deadlock_detect,
+ "Stop the simulation at deadlock (1=on (default), 0=off)", "1");
+ option_parser_register(
+ opp, "-gpgpu_ptx_instruction_classification", OPT_INT32,
+ &(gpgpu_ctx->func_sim->gpgpu_ptx_instruction_classification),
+ "if enabled will classify ptx instruction types per kernel (Max 255 "
+ "kernels now)",
+ "0");
+ option_parser_register(
+ opp, "-gpgpu_ptx_sim_mode", OPT_INT32,
+ &(gpgpu_ctx->func_sim->g_ptx_sim_mode),
+ "Select between Performance (default) or Functional simulation (1)", "0");
+ option_parser_register(opp, "-gpgpu_clock_domains", OPT_CSTR,
+ &gpgpu_clock_domains,
+ "Clock Domain Frequencies in MhZ {<Core Clock>:<ICNT "
+ "Clock>:<L2 Clock>:<DRAM Clock>}",
+ "500.0:2000.0:2000.0:2000.0");
+ option_parser_register(
+ opp, "-gpgpu_max_concurrent_kernel", OPT_INT32, &max_concurrent_kernel,
+ "maximum kernels that can run concurrently on GPU", "8");
+ option_parser_register(
+ opp, "-gpgpu_cflog_interval", OPT_INT32, &gpgpu_cflog_interval,
+ "Interval between each snapshot in control flow logger", "0");
+ option_parser_register(opp, "-visualizer_enabled", OPT_BOOL,
+ &g_visualizer_enabled,
+ "Turn on visualizer output (1=On, 0=Off)", "1");
+ option_parser_register(opp, "-visualizer_outputfile", OPT_CSTR,
+ &g_visualizer_filename,
+ "Specifies the output log file for visualizer", NULL);
+ option_parser_register(
+ opp, "-visualizer_zlevel", OPT_INT32, &g_visualizer_zlevel,
+ "Compression level of the visualizer output log (0=no comp, 9=highest)",
+ "6");
+ option_parser_register(opp, "-gpgpu_stack_size_limit", OPT_INT32,
+ &stack_size_limit, "GPU thread stack size", "1024");
+ option_parser_register(opp, "-gpgpu_heap_size_limit", OPT_INT32,
+ &heap_size_limit, "GPU malloc heap size ", "8388608");
+ option_parser_register(opp, "-gpgpu_runtime_sync_depth_limit", OPT_INT32,
+ &runtime_sync_depth_limit,
+ "GPU device runtime synchronize depth", "2");
+ option_parser_register(opp, "-gpgpu_runtime_pending_launch_count_limit",
+ OPT_INT32, &runtime_pending_launch_count_limit,
+ "GPU device runtime pending launch count", "2048");
+ option_parser_register(opp, "-trace_enabled", OPT_BOOL, &Trace::enabled,
+ "Turn on traces", "0");
+ option_parser_register(opp, "-trace_components", OPT_CSTR, &Trace::config_str,
+ "comma seperated list of traces to enable. "
+ "Complete list found in trace_streams.tup. "
+ "Default none",
+ "none");
+ option_parser_register(
+ opp, "-trace_sampling_core", OPT_INT32, &Trace::sampling_core,
+ "The core which is printed using CORE_DPRINTF. Default 0", "0");
+ option_parser_register(opp, "-trace_sampling_memory_partition", OPT_INT32,
+ &Trace::sampling_memory_partition,
+ "The memory partition which is printed using "
+ "MEMPART_DPRINTF. Default -1 (i.e. all)",
+ "-1");
+ gpgpu_ctx->stats->ptx_file_line_stats_options(opp);
- //Jin: kernel launch latency
- option_parser_register(opp, "-gpgpu_kernel_launch_latency", OPT_INT32,
- &(gpgpu_ctx->device_runtime->g_kernel_launch_latency), "Kernel launch latency in cycles. Default: 0",
- "0");
- option_parser_register(opp, "-gpgpu_cdp_enabled", OPT_BOOL,
- &(gpgpu_ctx->device_runtime->g_cdp_enabled), "Turn on CDP",
- "0");
+ // Jin: kernel launch latency
+ option_parser_register(opp, "-gpgpu_kernel_launch_latency", OPT_INT32,
+ &(gpgpu_ctx->device_runtime->g_kernel_launch_latency),
+ "Kernel launch latency in cycles. Default: 0", "0");
+ option_parser_register(opp, "-gpgpu_cdp_enabled", OPT_BOOL,
+ &(gpgpu_ctx->device_runtime->g_cdp_enabled),
+ "Turn on CDP", "0");
option_parser_register(opp, "-gpgpu_TB_launch_latency", OPT_INT32,
&(gpgpu_ctx->device_runtime->g_TB_launch_latency), "thread block launch latency in cycles. Default: 0",
@@ -606,78 +661,76 @@ void gpgpu_sim_config::reg_options(option_parser_t opp)
/////////////////////////////////////////////////////////////////////////////
-void increment_x_then_y_then_z( dim3 &i, const dim3 &bound)
-{
- i.x++;
- if ( i.x >= bound.x ) {
- i.x = 0;
- i.y++;
- if ( i.y >= bound.y ) {
- i.y = 0;
- if( i.z < bound.z )
- i.z++;
- }
- }
+void increment_x_then_y_then_z(dim3 &i, const dim3 &bound) {
+ i.x++;
+ if (i.x >= bound.x) {
+ i.x = 0;
+ i.y++;
+ if (i.y >= bound.y) {
+ i.y = 0;
+ if (i.z < bound.z) i.z++;
+ }
+ }
}
-void gpgpu_sim::launch( kernel_info_t *kinfo )
-{
- unsigned cta_size = kinfo->threads_per_cta();
- if ( cta_size > m_shader_config->n_thread_per_shader ) {
- printf("Execution error: Shader kernel CTA (block) size is too large for microarch config.\n");
- printf(" CTA size (x*y*z) = %u, max supported = %u\n", cta_size,
- m_shader_config->n_thread_per_shader );
- printf(" => either change -gpgpu_shader argument in gpgpusim.config file or\n");
- printf(" modify the CUDA source to decrease the kernel block size.\n");
- abort();
- }
- unsigned n=0;
- for(n=0; n < m_running_kernels.size(); n++ ) {
- if( (NULL==m_running_kernels[n]) || m_running_kernels[n]->done() ) {
- m_running_kernels[n] = kinfo;
- break;
- }
- }
- assert(n < m_running_kernels.size());
+void gpgpu_sim::launch(kernel_info_t *kinfo) {
+ unsigned cta_size = kinfo->threads_per_cta();
+ if (cta_size > m_shader_config->n_thread_per_shader) {
+ printf(
+ "Execution error: Shader kernel CTA (block) size is too large for "
+ "microarch config.\n");
+ printf(" CTA size (x*y*z) = %u, max supported = %u\n",
+ cta_size, m_shader_config->n_thread_per_shader);
+ printf(
+ " => either change -gpgpu_shader argument in "
+ "gpgpusim.config file or\n");
+ printf(
+ " modify the CUDA source to decrease the kernel block "
+ "size.\n");
+ abort();
+ }
+ unsigned n = 0;
+ for (n = 0; n < m_running_kernels.size(); n++) {
+ if ((NULL == m_running_kernels[n]) || m_running_kernels[n]->done()) {
+ m_running_kernels[n] = kinfo;
+ break;
+ }
+ }
+ assert(n < m_running_kernels.size());
}
-bool gpgpu_sim::can_start_kernel()
-{
- for(unsigned n=0; n < m_running_kernels.size(); n++ ) {
- if( (NULL==m_running_kernels[n]) || m_running_kernels[n]->done() )
- return true;
- }
- return false;
+bool gpgpu_sim::can_start_kernel() {
+ for (unsigned n = 0; n < m_running_kernels.size(); n++) {
+ if ((NULL == m_running_kernels[n]) || m_running_kernels[n]->done())
+ return true;
+ }
+ return false;
}
bool gpgpu_sim::hit_max_cta_count() const {
- if (m_config.gpu_max_cta_opt != 0) {
- if( (gpu_tot_issued_cta + m_total_cta_launched) >= m_config.gpu_max_cta_opt )
- return true;
- }
- return false;
+ if (m_config.gpu_max_cta_opt != 0) {
+ if ((gpu_tot_issued_cta + m_total_cta_launched) >= m_config.gpu_max_cta_opt)
+ return true;
+ }
+ return false;
}
bool gpgpu_sim::kernel_more_cta_left(kernel_info_t *kernel) const {
- if(hit_max_cta_count())
- return false;
+ if (hit_max_cta_count()) return false;
- if(kernel && !kernel->no_more_ctas_to_run())
- return true;
+ if (kernel && !kernel->no_more_ctas_to_run()) return true;
- return false;
+ return false;
}
-bool gpgpu_sim::get_more_cta_left() const
-{
- if(hit_max_cta_count())
- return false;
+bool gpgpu_sim::get_more_cta_left() const {
+ if (hit_max_cta_count()) return false;
- for(unsigned n=0; n < m_running_kernels.size(); n++ ) {
- if( m_running_kernels[n] && !m_running_kernels[n]->no_more_ctas_to_run() )
- return true;
- }
- return false;
+ for (unsigned n = 0; n < m_running_kernels.size(); n++) {
+ if (m_running_kernels[n] && !m_running_kernels[n]->no_more_ctas_to_run())
+ return true;
+ }
+ return false;
}
void gpgpu_sim::decrement_kernel_latency()
@@ -688,1231 +741,1308 @@ void gpgpu_sim::decrement_kernel_latency()
}
}
-kernel_info_t *gpgpu_sim::select_kernel()
-{
- if(m_running_kernels[m_last_issued_kernel] &&
+kernel_info_t *gpgpu_sim::select_kernel() {
+ if (m_running_kernels[m_last_issued_kernel] &&
!m_running_kernels[m_last_issued_kernel]->no_more_ctas_to_run() &&
!m_running_kernels[m_last_issued_kernel]->m_kernel_TB_latency) {
- unsigned launch_uid = m_running_kernels[m_last_issued_kernel]->get_uid();
- if(std::find(m_executed_kernel_uids.begin(), m_executed_kernel_uids.end(), launch_uid) == m_executed_kernel_uids.end()) {
- m_running_kernels[m_last_issued_kernel]->start_cycle = gpu_sim_cycle + gpu_tot_sim_cycle;
- m_executed_kernel_uids.push_back(launch_uid);
- m_executed_kernel_names.push_back(m_running_kernels[m_last_issued_kernel]->name());
- }
- return m_running_kernels[m_last_issued_kernel];
+ unsigned launch_uid = m_running_kernels[m_last_issued_kernel]->get_uid();
+ if (std::find(m_executed_kernel_uids.begin(), m_executed_kernel_uids.end(),
+ launch_uid) == m_executed_kernel_uids.end()) {
+ m_running_kernels[m_last_issued_kernel]->start_cycle =
+ gpu_sim_cycle + gpu_tot_sim_cycle;
+ m_executed_kernel_uids.push_back(launch_uid);
+ m_executed_kernel_names.push_back(
+ m_running_kernels[m_last_issued_kernel]->name());
}
+ return m_running_kernels[m_last_issued_kernel];
+ }
- for(unsigned n=0; n < m_running_kernels.size(); n++ ) {
- unsigned idx = (n+m_last_issued_kernel+1)%m_config.max_concurrent_kernel;
+ for (unsigned n = 0; n < m_running_kernels.size(); n++) {
+ unsigned idx =
+ (n + m_last_issued_kernel + 1) % m_config.max_concurrent_kernel;
if( kernel_more_cta_left(m_running_kernels[idx]) &&
!m_running_kernels[idx]->m_kernel_TB_latency){
- m_last_issued_kernel=idx;
- m_running_kernels[idx]->start_cycle = gpu_sim_cycle + gpu_tot_sim_cycle;
- // record this kernel for stat print if it is the first time this kernel is selected for execution
- unsigned launch_uid = m_running_kernels[idx]->get_uid();
- assert(std::find(m_executed_kernel_uids.begin(), m_executed_kernel_uids.end(), launch_uid) == m_executed_kernel_uids.end());
- m_executed_kernel_uids.push_back(launch_uid);
- m_executed_kernel_names.push_back(m_running_kernels[idx]->name());
+ m_last_issued_kernel = idx;
+ m_running_kernels[idx]->start_cycle = gpu_sim_cycle + gpu_tot_sim_cycle;
+ // record this kernel for stat print if it is the first time this kernel
+ // is selected for execution
+ unsigned launch_uid = m_running_kernels[idx]->get_uid();
+ assert(std::find(m_executed_kernel_uids.begin(),
+ m_executed_kernel_uids.end(),
+ launch_uid) == m_executed_kernel_uids.end());
+ m_executed_kernel_uids.push_back(launch_uid);
+ m_executed_kernel_names.push_back(m_running_kernels[idx]->name());
- return m_running_kernels[idx];
- }
+ return m_running_kernels[idx];
}
- return NULL;
+ }
+ return NULL;
}
-unsigned gpgpu_sim::finished_kernel()
-{
- if( m_finished_kernel.empty() )
- return 0;
- unsigned result = m_finished_kernel.front();
- m_finished_kernel.pop_front();
- return result;
+unsigned gpgpu_sim::finished_kernel() {
+ if (m_finished_kernel.empty()) return 0;
+ unsigned result = m_finished_kernel.front();
+ m_finished_kernel.pop_front();
+ return result;
}
-void gpgpu_sim::set_kernel_done( kernel_info_t *kernel )
-{
- unsigned uid = kernel->get_uid();
- m_finished_kernel.push_back(uid);
- std::vector<kernel_info_t*>::iterator k;
- for( k=m_running_kernels.begin(); k!=m_running_kernels.end(); k++ ) {
- if( *k == kernel ) {
- kernel->end_cycle = gpu_sim_cycle + gpu_tot_sim_cycle;
- *k = NULL;
- break;
- }
+void gpgpu_sim::set_kernel_done(kernel_info_t *kernel) {
+ unsigned uid = kernel->get_uid();
+ m_finished_kernel.push_back(uid);
+ std::vector<kernel_info_t *>::iterator k;
+ for (k = m_running_kernels.begin(); k != m_running_kernels.end(); k++) {
+ if (*k == kernel) {
+ kernel->end_cycle = gpu_sim_cycle + gpu_tot_sim_cycle;
+ *k = NULL;
+ break;
}
- assert( k != m_running_kernels.end() );
+ }
+ assert(k != m_running_kernels.end());
}
-void gpgpu_sim::stop_all_running_kernels(){
- std::vector<kernel_info_t *>::iterator k;
- for(k = m_running_kernels.begin(); k != m_running_kernels.end(); ++k){
- if(*k != NULL){ // If a kernel is active
- set_kernel_done(*k); // Stop the kernel
- assert(*k==NULL);
- }
+void gpgpu_sim::stop_all_running_kernels() {
+ std::vector<kernel_info_t *>::iterator k;
+ for (k = m_running_kernels.begin(); k != m_running_kernels.end(); ++k) {
+ if (*k != NULL) { // If a kernel is active
+ set_kernel_done(*k); // Stop the kernel
+ assert(*k == NULL);
}
+ }
}
-gpgpu_sim::gpgpu_sim( const gpgpu_sim_config &config, gpgpu_context* ctx )
- : gpgpu_t(config, ctx), m_config(config)
-{
- gpgpu_ctx = ctx;
- m_shader_config = &m_config.m_shader_config;
- m_memory_config = &m_config.m_memory_config;
- ctx->ptx_parser->set_ptx_warp_size(m_shader_config);
- ptx_file_line_stats_create_exposed_latency_tracker(m_config.num_shader());
+gpgpu_sim::gpgpu_sim(const gpgpu_sim_config &config, gpgpu_context *ctx)
+ : gpgpu_t(config, ctx), m_config(config) {
+ gpgpu_ctx = ctx;
+ m_shader_config = &m_config.m_shader_config;
+ m_memory_config = &m_config.m_memory_config;
+ ctx->ptx_parser->set_ptx_warp_size(m_shader_config);
+ ptx_file_line_stats_create_exposed_latency_tracker(m_config.num_shader());
#ifdef GPGPUSIM_POWER_MODEL
- m_gpgpusim_wrapper = new gpgpu_sim_wrapper(config.g_power_simulation_enabled,config.g_power_config_name);
+ m_gpgpusim_wrapper = new gpgpu_sim_wrapper(config.g_power_simulation_enabled,
+ config.g_power_config_name);
#endif
- m_shader_stats = new shader_core_stats(m_shader_config);
- m_memory_stats = new memory_stats_t(m_config.num_shader(),m_shader_config,m_memory_config,this);
- average_pipeline_duty_cycle = (float *)malloc(sizeof(float));
- active_sms=(float *)malloc(sizeof(float));
- m_power_stats = new power_stat_t(m_shader_config,average_pipeline_duty_cycle,active_sms,m_shader_stats,m_memory_config,m_memory_stats);
+ m_shader_stats = new shader_core_stats(m_shader_config);
+ m_memory_stats = new memory_stats_t(m_config.num_shader(), m_shader_config,
+ m_memory_config, this);
+ average_pipeline_duty_cycle = (float *)malloc(sizeof(float));
+ active_sms = (float *)malloc(sizeof(float));
+ m_power_stats =
+ new power_stat_t(m_shader_config, average_pipeline_duty_cycle, active_sms,
+ m_shader_stats, m_memory_config, m_memory_stats);
- gpu_sim_insn = 0;
- gpu_tot_sim_insn = 0;
- gpu_tot_issued_cta = 0;
- m_total_cta_launched = 0;
- gpu_deadlock = false;
+ gpu_sim_insn = 0;
+ gpu_tot_sim_insn = 0;
+ gpu_tot_issued_cta = 0;
+ gpu_completed_cta = 0;
+ m_total_cta_launched = 0;
+ gpu_deadlock = false;
- gpu_stall_dramfull = 0;
- gpu_stall_icnt2sh = 0;
- partiton_reqs_in_parallel = 0;
- partiton_reqs_in_parallel_total = 0;
- partiton_reqs_in_parallel_util = 0;
- partiton_reqs_in_parallel_util_total = 0;
- gpu_sim_cycle_parition_util = 0;
- gpu_tot_sim_cycle_parition_util = 0;
- partiton_replys_in_parallel = 0;
- partiton_replys_in_parallel_total = 0;
+ gpu_stall_dramfull = 0;
+ gpu_stall_icnt2sh = 0;
+ partiton_reqs_in_parallel = 0;
+ partiton_reqs_in_parallel_total = 0;
+ partiton_reqs_in_parallel_util = 0;
+ partiton_reqs_in_parallel_util_total = 0;
+ gpu_sim_cycle_parition_util = 0;
+ gpu_tot_sim_cycle_parition_util = 0;
+ partiton_replys_in_parallel = 0;
+ partiton_replys_in_parallel_total = 0;
- m_cluster = new simt_core_cluster*[m_shader_config->n_simt_clusters];
- for (unsigned i=0;i<m_shader_config->n_simt_clusters;i++)
- m_cluster[i] = new simt_core_cluster(this,i,m_shader_config,m_memory_config,m_shader_stats,m_memory_stats);
+ m_cluster = new simt_core_cluster *[m_shader_config->n_simt_clusters];
+ for (unsigned i = 0; i < m_shader_config->n_simt_clusters; i++)
+ m_cluster[i] =
+ new simt_core_cluster(this, i, m_shader_config, m_memory_config,
+ m_shader_stats, m_memory_stats);
- m_memory_partition_unit = new memory_partition_unit*[m_memory_config->m_n_mem];
- m_memory_sub_partition = new memory_sub_partition*[m_memory_config->m_n_mem_sub_partition];
- for (unsigned i=0;i<m_memory_config->m_n_mem;i++) {
- m_memory_partition_unit[i] = new memory_partition_unit(i, m_memory_config, m_memory_stats, this);
- for (unsigned p = 0; p < m_memory_config->m_n_sub_partition_per_memory_channel; p++) {
- unsigned submpid = i * m_memory_config->m_n_sub_partition_per_memory_channel + p;
- m_memory_sub_partition[submpid] = m_memory_partition_unit[i]->get_sub_partition(p);
- }
+ m_memory_partition_unit =
+ new memory_partition_unit *[m_memory_config->m_n_mem];
+ m_memory_sub_partition =
+ new memory_sub_partition *[m_memory_config->m_n_mem_sub_partition];
+ for (unsigned i = 0; i < m_memory_config->m_n_mem; i++) {
+ m_memory_partition_unit[i] =
+ new memory_partition_unit(i, m_memory_config, m_memory_stats, this);
+ for (unsigned p = 0;
+ p < m_memory_config->m_n_sub_partition_per_memory_channel; p++) {
+ unsigned submpid =
+ i * m_memory_config->m_n_sub_partition_per_memory_channel + p;
+ m_memory_sub_partition[submpid] =
+ m_memory_partition_unit[i]->get_sub_partition(p);
}
+ }
- icnt_wrapper_init();
- icnt_create(m_shader_config->n_simt_clusters,m_memory_config->m_n_mem_sub_partition);
+ icnt_wrapper_init();
+ icnt_create(m_shader_config->n_simt_clusters,
+ m_memory_config->m_n_mem_sub_partition);
- time_vector_create(NUM_MEM_REQ_STAT);
- fprintf(stdout, "GPGPU-Sim uArch: performance model initialization complete.\n");
+ time_vector_create(NUM_MEM_REQ_STAT);
+ fprintf(stdout,
+ "GPGPU-Sim uArch: performance model initialization complete.\n");
- m_running_kernels.resize( config.max_concurrent_kernel, NULL );
- m_last_issued_kernel = 0;
- m_last_cluster_issue = m_shader_config->n_simt_clusters-1; // this causes first launch to use simt cluster 0
- *average_pipeline_duty_cycle=0;
- *active_sms=0;
+ m_running_kernels.resize(config.max_concurrent_kernel, NULL);
+ m_last_issued_kernel = 0;
+ m_last_cluster_issue = m_shader_config->n_simt_clusters -
+ 1; // this causes first launch to use simt cluster 0
+ *average_pipeline_duty_cycle = 0;
+ *active_sms = 0;
- last_liveness_message_time = 0;
-
- //Jin: functional simulation for CDP
- m_functional_sim = false;
- m_functional_sim_kernel = NULL;
-}
+ last_liveness_message_time = 0;
-int gpgpu_sim::shared_mem_size() const
-{
- return m_shader_config->gpgpu_shmem_size;
+ // Jin: functional simulation for CDP
+ m_functional_sim = false;
+ m_functional_sim_kernel = NULL;
}
-int gpgpu_sim::shared_mem_per_block() const
-{
- return m_shader_config->gpgpu_shmem_per_block;
+int gpgpu_sim::shared_mem_size() const {
+ return m_shader_config->gpgpu_shmem_size;
}
-int gpgpu_sim::num_registers_per_core() const
-{
- return m_shader_config->gpgpu_shader_registers;
+int gpgpu_sim::shared_mem_per_block() const {
+ return m_shader_config->gpgpu_shmem_per_block;
}
-int gpgpu_sim::num_registers_per_block() const
-{
- return m_shader_config->gpgpu_registers_per_block;
+int gpgpu_sim::num_registers_per_core() const {
+ return m_shader_config->gpgpu_shader_registers;
}
-int gpgpu_sim::wrp_size() const
-{
- return m_shader_config->warp_size;
+int gpgpu_sim::num_registers_per_block() const {
+ return m_shader_config->gpgpu_registers_per_block;
}
-int gpgpu_sim::shader_clock() const
-{
- return m_config.core_freq/1000;
-}
+int gpgpu_sim::wrp_size() const { return m_shader_config->warp_size; }
-int gpgpu_sim::max_cta_per_core() const
-{
- return m_shader_config->max_cta_per_core;
-}
+int gpgpu_sim::shader_clock() const { return m_config.core_freq / 1000; }
-int gpgpu_sim::get_max_cta( const kernel_info_t &k ) const
-{
- return m_shader_config->max_cta(k);
+int gpgpu_sim::max_cta_per_core() const {
+ return m_shader_config->max_cta_per_core;
}
-void gpgpu_sim::set_prop( cudaDeviceProp *prop )
-{
- m_cuda_properties = prop;
+int gpgpu_sim::get_max_cta(const kernel_info_t &k) const {
+ return m_shader_config->max_cta(k);
}
-int gpgpu_sim::compute_capability_major() const
-{
- return m_config.gpgpu_compute_capability_major;
+void gpgpu_sim::set_prop(cudaDeviceProp *prop) { m_cuda_properties = prop; }
+
+int gpgpu_sim::compute_capability_major() const {
+ return m_config.gpgpu_compute_capability_major;
}
-int gpgpu_sim::compute_capability_minor() const
-{
- return m_config.gpgpu_compute_capability_minor;
+int gpgpu_sim::compute_capability_minor() const {
+ return m_config.gpgpu_compute_capability_minor;
}
-const struct cudaDeviceProp *gpgpu_sim::get_prop() const
-{
- return m_cuda_properties;
+const struct cudaDeviceProp *gpgpu_sim::get_prop() const {
+ return m_cuda_properties;
}
-enum divergence_support_t gpgpu_sim::simd_model() const
-{
- return m_shader_config->model;
+enum divergence_support_t gpgpu_sim::simd_model() const {
+ return m_shader_config->model;
}
-void gpgpu_sim_config::init_clock_domains(void )
-{
- sscanf(gpgpu_clock_domains,"%lf:%lf:%lf:%lf",
- &core_freq, &icnt_freq, &l2_freq, &dram_freq);
- core_freq = core_freq MhZ;
- icnt_freq = icnt_freq MhZ;
- l2_freq = l2_freq MhZ;
- dram_freq = dram_freq MhZ;
- core_period = 1/core_freq;
- icnt_period = 1/icnt_freq;
- dram_period = 1/dram_freq;
- l2_period = 1/l2_freq;
- printf("GPGPU-Sim uArch: clock freqs: %lf:%lf:%lf:%lf\n",core_freq,icnt_freq,l2_freq,dram_freq);
- printf("GPGPU-Sim uArch: clock periods: %.20lf:%.20lf:%.20lf:%.20lf\n",core_period,icnt_period,l2_period,dram_period);
+void gpgpu_sim_config::init_clock_domains(void) {
+ sscanf(gpgpu_clock_domains, "%lf:%lf:%lf:%lf", &core_freq, &icnt_freq,
+ &l2_freq, &dram_freq);
+ core_freq = core_freq MhZ;
+ icnt_freq = icnt_freq MhZ;
+ l2_freq = l2_freq MhZ;
+ dram_freq = dram_freq MhZ;
+ core_period = 1 / core_freq;
+ icnt_period = 1 / icnt_freq;
+ dram_period = 1 / dram_freq;
+ l2_period = 1 / l2_freq;
+ printf("GPGPU-Sim uArch: clock freqs: %lf:%lf:%lf:%lf\n", core_freq,
+ icnt_freq, l2_freq, dram_freq);
+ printf("GPGPU-Sim uArch: clock periods: %.20lf:%.20lf:%.20lf:%.20lf\n",
+ core_period, icnt_period, l2_period, dram_period);
}
-void gpgpu_sim::reinit_clock_domains(void)
-{
- core_time = 0;
- dram_time = 0;
- icnt_time = 0;
- l2_time = 0;
+void gpgpu_sim::reinit_clock_domains(void) {
+ core_time = 0;
+ dram_time = 0;
+ icnt_time = 0;
+ l2_time = 0;
}
-bool gpgpu_sim::active()
-{
- if (m_config.gpu_max_cycle_opt && (gpu_tot_sim_cycle + gpu_sim_cycle) >= m_config.gpu_max_cycle_opt)
- return false;
- if (m_config.gpu_max_insn_opt && (gpu_tot_sim_insn + gpu_sim_insn) >= m_config.gpu_max_insn_opt)
- return false;
- if (m_config.gpu_max_cta_opt && (gpu_tot_issued_cta >= m_config.gpu_max_cta_opt) )
- return false;
- if (m_config.gpu_deadlock_detect && gpu_deadlock)
- return false;
- for (unsigned i=0;i<m_shader_config->n_simt_clusters;i++)
- if( m_cluster[i]->get_not_completed()>0 )
- return true;;
- for (unsigned i=0;i<m_memory_config->m_n_mem;i++)
- if( m_memory_partition_unit[i]->busy()>0 )
- return true;;
- if( icnt_busy() )
- return true;
- if( get_more_cta_left() )
- return true;
+bool gpgpu_sim::active() {
+ if (m_config.gpu_max_cycle_opt &&
+ (gpu_tot_sim_cycle + gpu_sim_cycle) >= m_config.gpu_max_cycle_opt)
return false;
+ if (m_config.gpu_max_insn_opt &&
+ (gpu_tot_sim_insn + gpu_sim_insn) >= m_config.gpu_max_insn_opt)
+ return false;
+ if (m_config.gpu_max_cta_opt &&
+ (gpu_tot_issued_cta >= m_config.gpu_max_cta_opt))
+ return false;
+ if (m_config.gpu_max_completed_cta_opt &&
+ (gpu_completed_cta >= m_config.gpu_max_completed_cta_opt))
+ return false;
+ if (m_config.gpu_deadlock_detect && gpu_deadlock) return false;
+ for (unsigned i = 0; i < m_shader_config->n_simt_clusters; i++)
+ if (m_cluster[i]->get_not_completed() > 0) return true;
+ ;
+ for (unsigned i = 0; i < m_memory_config->m_n_mem; i++)
+ if (m_memory_partition_unit[i]->busy() > 0) return true;
+ ;
+ if (icnt_busy()) return true;
+ if (get_more_cta_left()) return true;
+ return false;
}
-void gpgpu_sim::init()
-{
- // run a CUDA grid on the GPU microarchitecture simulator
- gpu_sim_cycle = 0;
- gpu_sim_insn = 0;
- last_gpu_sim_insn = 0;
- m_total_cta_launched=0;
- partiton_reqs_in_parallel = 0;
- partiton_replys_in_parallel = 0;
- partiton_reqs_in_parallel_util = 0;
- gpu_sim_cycle_parition_util = 0;
+void gpgpu_sim::init() {
+ // run a CUDA grid on the GPU microarchitecture simulator
+ gpu_sim_cycle = 0;
+ gpu_sim_insn = 0;
+ last_gpu_sim_insn = 0;
+ m_total_cta_launched = 0;
+ gpu_completed_cta = 0;
+ partiton_reqs_in_parallel = 0;
+ partiton_replys_in_parallel = 0;
+ partiton_reqs_in_parallel_util = 0;
+ gpu_sim_cycle_parition_util = 0;
- reinit_clock_domains();
- gpgpu_ctx->func_sim->set_param_gpgpu_num_shaders(m_config.num_shader());
- for (unsigned i=0;i<m_shader_config->n_simt_clusters;i++)
- m_cluster[i]->reinit();
- m_shader_stats->new_grid();
- // initialize the control-flow, memory access, memory latency logger
- if (m_config.g_visualizer_enabled) {
- create_thread_CFlogger( gpgpu_ctx, m_config.num_shader(), m_shader_config->n_thread_per_shader, 0, m_config.gpgpu_cflog_interval );
- }
- shader_CTA_count_create( m_config.num_shader(), m_config.gpgpu_cflog_interval);
- if (m_config.gpgpu_cflog_interval != 0) {
- insn_warp_occ_create( m_config.num_shader(), m_shader_config->warp_size );
- shader_warp_occ_create( m_config.num_shader(), m_shader_config->warp_size, m_config.gpgpu_cflog_interval);
- shader_mem_acc_create( m_config.num_shader(), m_memory_config->m_n_mem, 4, m_config.gpgpu_cflog_interval);
- shader_mem_lat_create( m_config.num_shader(), m_config.gpgpu_cflog_interval);
- shader_cache_access_create( m_config.num_shader(), 3, m_config.gpgpu_cflog_interval);
- set_spill_interval (m_config.gpgpu_cflog_interval * 40);
- }
+ reinit_clock_domains();
+ gpgpu_ctx->func_sim->set_param_gpgpu_num_shaders(m_config.num_shader());
+ for (unsigned i = 0; i < m_shader_config->n_simt_clusters; i++)
+ m_cluster[i]->reinit();
+ m_shader_stats->new_grid();
+ // initialize the control-flow, memory access, memory latency logger
+ if (m_config.g_visualizer_enabled) {
+ create_thread_CFlogger(gpgpu_ctx, m_config.num_shader(),
+ m_shader_config->n_thread_per_shader, 0,
+ m_config.gpgpu_cflog_interval);
+ }
+ shader_CTA_count_create(m_config.num_shader(), m_config.gpgpu_cflog_interval);
+ if (m_config.gpgpu_cflog_interval != 0) {
+ insn_warp_occ_create(m_config.num_shader(), m_shader_config->warp_size);
+ shader_warp_occ_create(m_config.num_shader(), m_shader_config->warp_size,
+ m_config.gpgpu_cflog_interval);
+ shader_mem_acc_create(m_config.num_shader(), m_memory_config->m_n_mem, 4,
+ m_config.gpgpu_cflog_interval);
+ shader_mem_lat_create(m_config.num_shader(), m_config.gpgpu_cflog_interval);
+ shader_cache_access_create(m_config.num_shader(), 3,
+ m_config.gpgpu_cflog_interval);
+ set_spill_interval(m_config.gpgpu_cflog_interval * 40);
+ }
- if (g_network_mode)
- icnt_init();
+ if (g_network_mode) icnt_init();
// McPAT initialization function. Called on first launch of GPU
#ifdef GPGPUSIM_POWER_MODEL
- if(m_config.g_power_simulation_enabled){
- init_mcpat(m_config, m_gpgpusim_wrapper, m_config.gpu_stat_sample_freq, gpu_tot_sim_insn, gpu_sim_insn);
- }
+ if (m_config.g_power_simulation_enabled) {
+ init_mcpat(m_config, m_gpgpusim_wrapper, m_config.gpu_stat_sample_freq,
+ gpu_tot_sim_insn, gpu_sim_insn);
+ }
#endif
}
void gpgpu_sim::update_stats() {
- m_memory_stats->memlatstat_lat_pw();
- gpu_tot_sim_cycle += gpu_sim_cycle;
- gpu_tot_sim_insn += gpu_sim_insn;
- gpu_tot_issued_cta += m_total_cta_launched;
- partiton_reqs_in_parallel_total += partiton_reqs_in_parallel;
- partiton_replys_in_parallel_total += partiton_replys_in_parallel;
- partiton_reqs_in_parallel_util_total += partiton_reqs_in_parallel_util;
- gpu_tot_sim_cycle_parition_util += gpu_sim_cycle_parition_util ;
- gpu_tot_occupancy += gpu_occupancy;
+ m_memory_stats->memlatstat_lat_pw();
+ gpu_tot_sim_cycle += gpu_sim_cycle;
+ gpu_tot_sim_insn += gpu_sim_insn;
+ gpu_tot_issued_cta += m_total_cta_launched;
+ partiton_reqs_in_parallel_total += partiton_reqs_in_parallel;
+ partiton_replys_in_parallel_total += partiton_replys_in_parallel;
+ partiton_reqs_in_parallel_util_total += partiton_reqs_in_parallel_util;
+ gpu_tot_sim_cycle_parition_util += gpu_sim_cycle_parition_util;
+ gpu_tot_occupancy += gpu_occupancy;
- gpu_sim_cycle = 0;
- partiton_reqs_in_parallel = 0;
- partiton_replys_in_parallel = 0;
- partiton_reqs_in_parallel_util = 0;
- gpu_sim_cycle_parition_util = 0;
- gpu_sim_insn = 0;
- m_total_cta_launched = 0;
- gpu_occupancy = occupancy_stats();
+ gpu_sim_cycle = 0;
+ partiton_reqs_in_parallel = 0;
+ partiton_replys_in_parallel = 0;
+ partiton_reqs_in_parallel_util = 0;
+ gpu_sim_cycle_parition_util = 0;
+ gpu_sim_insn = 0;
+ m_total_cta_launched = 0;
+ gpu_completed_cta = 0;
+ gpu_occupancy = occupancy_stats();
}
-void gpgpu_sim::print_stats()
-{
- gpgpu_ctx->stats->ptx_file_line_stats_write_file();
- gpu_print_stat();
+void gpgpu_sim::print_stats() {
+ gpgpu_ctx->stats->ptx_file_line_stats_write_file();
+ gpu_print_stat();
- if (g_network_mode) {
- printf("----------------------------Interconnect-DETAILS--------------------------------\n" );
- icnt_display_stats();
- icnt_display_overall_stats();
- printf("----------------------------END-of-Interconnect-DETAILS-------------------------\n" );
- }
+ if (g_network_mode) {
+ printf(
+ "----------------------------Interconnect-DETAILS----------------------"
+ "----------\n");
+ icnt_display_stats();
+ icnt_display_overall_stats();
+ printf(
+ "----------------------------END-of-Interconnect-DETAILS---------------"
+ "----------\n");
+ }
}
-void gpgpu_sim::deadlock_check()
-{
- if (m_config.gpu_deadlock_detect && gpu_deadlock) {
- fflush(stdout);
- printf("\n\nGPGPU-Sim uArch: ERROR ** deadlock detected: last writeback core %u @ gpu_sim_cycle %u (+ gpu_tot_sim_cycle %u) (%u cycles ago)\n",
- gpu_sim_insn_last_update_sid,
- (unsigned) gpu_sim_insn_last_update, (unsigned) (gpu_tot_sim_cycle-gpu_sim_cycle),
- (unsigned) (gpu_sim_cycle - gpu_sim_insn_last_update ));
- unsigned num_cores=0;
- for (unsigned i=0;i<m_shader_config->n_simt_clusters;i++) {
- unsigned not_completed = m_cluster[i]->get_not_completed();
- if( not_completed ) {
- if ( !num_cores ) {
- printf("GPGPU-Sim uArch: DEADLOCK shader cores no longer committing instructions [core(# threads)]:\n" );
- printf("GPGPU-Sim uArch: DEADLOCK ");
- m_cluster[i]->print_not_completed(stdout);
- } else if (num_cores < 8 ) {
- m_cluster[i]->print_not_completed(stdout);
- } else if (num_cores >= 8 ) {
- printf(" + others ... ");
- }
- num_cores+=m_shader_config->n_simt_cores_per_cluster;
- }
- }
- printf("\n");
- for (unsigned i=0;i<m_memory_config->m_n_mem;i++) {
- bool busy = m_memory_partition_unit[i]->busy();
- if( busy )
- printf("GPGPU-Sim uArch DEADLOCK: memory partition %u busy\n", i );
- }
- if( icnt_busy() ) {
- printf("GPGPU-Sim uArch DEADLOCK: iterconnect contains traffic\n");
- icnt_display_state( stdout );
+void gpgpu_sim::deadlock_check() {
+ if (m_config.gpu_deadlock_detect && gpu_deadlock) {
+ fflush(stdout);
+ printf(
+ "\n\nGPGPU-Sim uArch: ERROR ** deadlock detected: last writeback core "
+ "%u @ gpu_sim_cycle %u (+ gpu_tot_sim_cycle %u) (%u cycles ago)\n",
+ gpu_sim_insn_last_update_sid, (unsigned)gpu_sim_insn_last_update,
+ (unsigned)(gpu_tot_sim_cycle - gpu_sim_cycle),
+ (unsigned)(gpu_sim_cycle - gpu_sim_insn_last_update));
+ unsigned num_cores = 0;
+ for (unsigned i = 0; i < m_shader_config->n_simt_clusters; i++) {
+ unsigned not_completed = m_cluster[i]->get_not_completed();
+ if (not_completed) {
+ if (!num_cores) {
+ printf(
+ "GPGPU-Sim uArch: DEADLOCK shader cores no longer committing "
+ "instructions [core(# threads)]:\n");
+ printf("GPGPU-Sim uArch: DEADLOCK ");
+ m_cluster[i]->print_not_completed(stdout);
+ } else if (num_cores < 8) {
+ m_cluster[i]->print_not_completed(stdout);
+ } else if (num_cores >= 8) {
+ printf(" + others ... ");
+ }
+ num_cores += m_shader_config->n_simt_cores_per_cluster;
}
- printf("\nRe-run the simulator in gdb and use debug routines in .gdbinit to debug this\n");
- fflush(stdout);
- abort();
- }
+ }
+ printf("\n");
+ for (unsigned i = 0; i < m_memory_config->m_n_mem; i++) {
+ bool busy = m_memory_partition_unit[i]->busy();
+ if (busy)
+ printf("GPGPU-Sim uArch DEADLOCK: memory partition %u busy\n", i);
+ }
+ if (icnt_busy()) {
+ printf("GPGPU-Sim uArch DEADLOCK: iterconnect contains traffic\n");
+ icnt_display_state(stdout);
+ }
+ printf(
+ "\nRe-run the simulator in gdb and use debug routines in .gdbinit to "
+ "debug this\n");
+ fflush(stdout);
+ abort();
+ }
}
-/// printing the names and uids of a set of executed kernels (usually there is only one)
-std::string gpgpu_sim::executed_kernel_info_string()
-{
- std::stringstream statout;
+/// printing the names and uids of a set of executed kernels (usually there is
+/// only one)
+std::string gpgpu_sim::executed_kernel_info_string() {
+ std::stringstream statout;
- statout << "kernel_name = ";
- for (unsigned int k = 0; k < m_executed_kernel_names.size(); k++) {
- statout << m_executed_kernel_names[k] << " ";
- }
- statout << std::endl;
- statout << "kernel_launch_uid = ";
- for (unsigned int k = 0; k < m_executed_kernel_uids.size(); k++) {
- statout << m_executed_kernel_uids[k] << " ";
- }
- statout << std::endl;
+ statout << "kernel_name = ";
+ for (unsigned int k = 0; k < m_executed_kernel_names.size(); k++) {
+ statout << m_executed_kernel_names[k] << " ";
+ }
+ statout << std::endl;
+ statout << "kernel_launch_uid = ";
+ for (unsigned int k = 0; k < m_executed_kernel_uids.size(); k++) {
+ statout << m_executed_kernel_uids[k] << " ";
+ }
+ statout << std::endl;
- return statout.str();
+ return statout.str();
}
-void gpgpu_sim::set_cache_config(std::string kernel_name, FuncCache cacheConfig )
-{
- m_special_cache_config[kernel_name]=cacheConfig ;
+void gpgpu_sim::set_cache_config(std::string kernel_name,
+ FuncCache cacheConfig) {
+ m_special_cache_config[kernel_name] = cacheConfig;
}
-FuncCache gpgpu_sim::get_cache_config(std::string kernel_name)
-{
- for ( std::map<std::string, FuncCache>::iterator iter = m_special_cache_config.begin(); iter != m_special_cache_config.end(); iter++){
- std::string kernel= iter->first;
- if (kernel_name.compare(kernel) == 0){
- return iter->second;
- }
- }
- return (FuncCache)0;
+FuncCache gpgpu_sim::get_cache_config(std::string kernel_name) {
+ for (std::map<std::string, FuncCache>::iterator iter =
+ m_special_cache_config.begin();
+ iter != m_special_cache_config.end(); iter++) {
+ std::string kernel = iter->first;
+ if (kernel_name.compare(kernel) == 0) {
+ return iter->second;
+ }
+ }
+ return (FuncCache)0;
}
-bool gpgpu_sim::has_special_cache_config(std::string kernel_name)
-{
- for ( std::map<std::string, FuncCache>::iterator iter = m_special_cache_config.begin(); iter != m_special_cache_config.end(); iter++){
- std::string kernel= iter->first;
- if (kernel_name.compare(kernel) == 0){
- return true;
- }
- }
- return false;
+bool gpgpu_sim::has_special_cache_config(std::string kernel_name) {
+ for (std::map<std::string, FuncCache>::iterator iter =
+ m_special_cache_config.begin();
+ iter != m_special_cache_config.end(); iter++) {
+ std::string kernel = iter->first;
+ if (kernel_name.compare(kernel) == 0) {
+ return true;
+ }
+ }
+ return false;
}
-
-void gpgpu_sim::set_cache_config(std::string kernel_name)
-{
- if(has_special_cache_config(kernel_name)){
- change_cache_config(get_cache_config(kernel_name));
- }else{
- change_cache_config(FuncCachePreferNone);
- }
+void gpgpu_sim::set_cache_config(std::string kernel_name) {
+ if (has_special_cache_config(kernel_name)) {
+ change_cache_config(get_cache_config(kernel_name));
+ } else {
+ change_cache_config(FuncCachePreferNone);
+ }
}
+void gpgpu_sim::change_cache_config(FuncCache cache_config) {
+ if (cache_config != m_shader_config->m_L1D_config.get_cache_status()) {
+ printf("FLUSH L1 Cache at configuration change between kernels\n");
+ for (unsigned i = 0; i < m_shader_config->n_simt_clusters; i++) {
+ m_cluster[i]->cache_invalidate();
+ }
+ }
-void gpgpu_sim::change_cache_config(FuncCache cache_config)
-{
- if(cache_config != m_shader_config->m_L1D_config.get_cache_status()){
- printf("FLUSH L1 Cache at configuration change between kernels\n");
- for (unsigned i=0;i<m_shader_config->n_simt_clusters;i++) {
- m_cluster[i]->cache_invalidate();
- }
- }
-
- switch(cache_config){
- case FuncCachePreferNone:
- m_shader_config->m_L1D_config.init(m_shader_config->m_L1D_config.m_config_string, FuncCachePreferNone);
- m_shader_config->gpgpu_shmem_size=m_shader_config->gpgpu_shmem_sizeDefault;
- break;
- case FuncCachePreferL1:
- if((m_shader_config->m_L1D_config.m_config_stringPrefL1 == NULL) || (m_shader_config->gpgpu_shmem_sizePrefL1 == (unsigned)-1))
- {
- printf("WARNING: missing Preferred L1 configuration\n");
- m_shader_config->m_L1D_config.init(m_shader_config->m_L1D_config.m_config_string, FuncCachePreferNone);
- m_shader_config->gpgpu_shmem_size=m_shader_config->gpgpu_shmem_sizeDefault;
+ switch (cache_config) {
+ case FuncCachePreferNone:
+ m_shader_config->m_L1D_config.init(
+ m_shader_config->m_L1D_config.m_config_string, FuncCachePreferNone);
+ m_shader_config->gpgpu_shmem_size =
+ m_shader_config->gpgpu_shmem_sizeDefault;
+ break;
+ case FuncCachePreferL1:
+ if ((m_shader_config->m_L1D_config.m_config_stringPrefL1 == NULL) ||
+ (m_shader_config->gpgpu_shmem_sizePrefL1 == (unsigned)-1)) {
+ printf("WARNING: missing Preferred L1 configuration\n");
+ m_shader_config->m_L1D_config.init(
+ m_shader_config->m_L1D_config.m_config_string, FuncCachePreferNone);
+ m_shader_config->gpgpu_shmem_size =
+ m_shader_config->gpgpu_shmem_sizeDefault;
- }else{
- m_shader_config->m_L1D_config.init(m_shader_config->m_L1D_config.m_config_stringPrefL1, FuncCachePreferL1);
- m_shader_config->gpgpu_shmem_size=m_shader_config->gpgpu_shmem_sizePrefL1;
- }
- break;
- case FuncCachePreferShared:
- if((m_shader_config->m_L1D_config.m_config_stringPrefShared == NULL) || (m_shader_config->gpgpu_shmem_sizePrefShared == (unsigned)-1))
- {
- printf("WARNING: missing Preferred L1 configuration\n");
- m_shader_config->m_L1D_config.init(m_shader_config->m_L1D_config.m_config_string, FuncCachePreferNone);
- m_shader_config->gpgpu_shmem_size=m_shader_config->gpgpu_shmem_sizeDefault;
- }else{
- m_shader_config->m_L1D_config.init(m_shader_config->m_L1D_config.m_config_stringPrefShared, FuncCachePreferShared);
- m_shader_config->gpgpu_shmem_size=m_shader_config->gpgpu_shmem_sizePrefShared;
- }
- break;
- default:
- break;
- }
+ } else {
+ m_shader_config->m_L1D_config.init(
+ m_shader_config->m_L1D_config.m_config_stringPrefL1,
+ FuncCachePreferL1);
+ m_shader_config->gpgpu_shmem_size =
+ m_shader_config->gpgpu_shmem_sizePrefL1;
+ }
+ break;
+ case FuncCachePreferShared:
+ if ((m_shader_config->m_L1D_config.m_config_stringPrefShared == NULL) ||
+ (m_shader_config->gpgpu_shmem_sizePrefShared == (unsigned)-1)) {
+ printf("WARNING: missing Preferred L1 configuration\n");
+ m_shader_config->m_L1D_config.init(
+ m_shader_config->m_L1D_config.m_config_string, FuncCachePreferNone);
+ m_shader_config->gpgpu_shmem_size =
+ m_shader_config->gpgpu_shmem_sizeDefault;
+ } else {
+ m_shader_config->m_L1D_config.init(
+ m_shader_config->m_L1D_config.m_config_stringPrefShared,
+ FuncCachePreferShared);
+ m_shader_config->gpgpu_shmem_size =
+ m_shader_config->gpgpu_shmem_sizePrefShared;
+ }
+ break;
+ default:
+ break;
+ }
}
-
-void gpgpu_sim::clear_executed_kernel_info()
-{
- m_executed_kernel_names.clear();
- m_executed_kernel_uids.clear();
+void gpgpu_sim::clear_executed_kernel_info() {
+ m_executed_kernel_names.clear();
+ m_executed_kernel_uids.clear();
}
-void gpgpu_sim::gpu_print_stat()
-{
- FILE *statfout = stdout;
-
- std::string kernel_info_str = executed_kernel_info_string();
- fprintf(statfout, "%s", kernel_info_str.c_str());
+void gpgpu_sim::gpu_print_stat() {
+ FILE *statfout = stdout;
- printf("gpu_sim_cycle = %lld\n", gpu_sim_cycle);
- printf("gpu_sim_insn = %lld\n", gpu_sim_insn);
- printf("gpu_ipc = %12.4f\n", (float)gpu_sim_insn / gpu_sim_cycle);
- printf("gpu_tot_sim_cycle = %lld\n", gpu_tot_sim_cycle+gpu_sim_cycle);
- printf("gpu_tot_sim_insn = %lld\n", gpu_tot_sim_insn+gpu_sim_insn);
- printf("gpu_tot_ipc = %12.4f\n", (float)(gpu_tot_sim_insn+gpu_sim_insn) / (gpu_tot_sim_cycle+gpu_sim_cycle));
- printf("gpu_tot_issued_cta = %lld\n", gpu_tot_issued_cta + m_total_cta_launched);
- printf("gpu_occupancy = %.4f%% \n", gpu_occupancy.get_occ_fraction() * 100);
- printf("gpu_tot_occupancy = %.4f%% \n", (gpu_occupancy + gpu_tot_occupancy).get_occ_fraction() * 100);
+ std::string kernel_info_str = executed_kernel_info_string();
+ fprintf(statfout, "%s", kernel_info_str.c_str());
+ printf("gpu_sim_cycle = %lld\n", gpu_sim_cycle);
+ printf("gpu_sim_insn = %lld\n", gpu_sim_insn);
+ printf("gpu_ipc = %12.4f\n", (float)gpu_sim_insn / gpu_sim_cycle);
+ printf("gpu_tot_sim_cycle = %lld\n", gpu_tot_sim_cycle + gpu_sim_cycle);
+ printf("gpu_tot_sim_insn = %lld\n", gpu_tot_sim_insn + gpu_sim_insn);
+ printf("gpu_tot_ipc = %12.4f\n", (float)(gpu_tot_sim_insn + gpu_sim_insn) /
+ (gpu_tot_sim_cycle + gpu_sim_cycle));
+ printf("gpu_tot_issued_cta = %lld\n",
+ gpu_tot_issued_cta + m_total_cta_launched);
+ printf("gpu_occupancy = %.4f%% \n", gpu_occupancy.get_occ_fraction() * 100);
+ printf("gpu_tot_occupancy = %.4f%% \n",
+ (gpu_occupancy + gpu_tot_occupancy).get_occ_fraction() * 100);
- fprintf(statfout, "max_total_param_size = %llu\n", gpgpu_ctx->device_runtime->g_max_total_param_size);
+ fprintf(statfout, "max_total_param_size = %llu\n",
+ gpgpu_ctx->device_runtime->g_max_total_param_size);
- // performance counter for stalls due to congestion.
- printf("gpu_stall_dramfull = %d\n", gpu_stall_dramfull);
- printf("gpu_stall_icnt2sh = %d\n", gpu_stall_icnt2sh );
+ // performance counter for stalls due to congestion.
+ printf("gpu_stall_dramfull = %d\n", gpu_stall_dramfull);
+ printf("gpu_stall_icnt2sh = %d\n", gpu_stall_icnt2sh);
- //printf("partiton_reqs_in_parallel = %lld\n", partiton_reqs_in_parallel);
- //printf("partiton_reqs_in_parallel_total = %lld\n", partiton_reqs_in_parallel_total );
- printf("partiton_level_parallism = %12.4f\n", (float)partiton_reqs_in_parallel / gpu_sim_cycle);
- printf("partiton_level_parallism_total = %12.4f\n", (float)(partiton_reqs_in_parallel+partiton_reqs_in_parallel_total) / (gpu_tot_sim_cycle+gpu_sim_cycle) );
- //printf("partiton_reqs_in_parallel_util = %lld\n", partiton_reqs_in_parallel_util);
- //printf("partiton_reqs_in_parallel_util_total = %lld\n", partiton_reqs_in_parallel_util_total );
- //printf("gpu_sim_cycle_parition_util = %lld\n", gpu_sim_cycle_parition_util);
- // printf("gpu_tot_sim_cycle_parition_util = %lld\n", gpu_tot_sim_cycle_parition_util );
- printf("partiton_level_parallism_util = %12.4f\n", (float)partiton_reqs_in_parallel_util / gpu_sim_cycle_parition_util);
- printf("partiton_level_parallism_util_total = %12.4f\n", (float)(partiton_reqs_in_parallel_util+partiton_reqs_in_parallel_util_total) / (gpu_sim_cycle_parition_util+gpu_tot_sim_cycle_parition_util) );
- //printf("partiton_replys_in_parallel = %lld\n", partiton_replys_in_parallel);
- //printf("partiton_replys_in_parallel_total = %lld\n", partiton_replys_in_parallel_total );
- printf("L2_BW = %12.4f GB/Sec\n", ((float)(partiton_replys_in_parallel * 32) / (gpu_sim_cycle * m_config.icnt_period)) / 1000000000);
- printf("L2_BW_total = %12.4f GB/Sec\n", ((float)((partiton_replys_in_parallel+partiton_replys_in_parallel_total) * 32) / ((gpu_tot_sim_cycle+gpu_sim_cycle) * m_config.icnt_period)) / 1000000000 );
+ // printf("partiton_reqs_in_parallel = %lld\n", partiton_reqs_in_parallel);
+ // printf("partiton_reqs_in_parallel_total = %lld\n",
+ // partiton_reqs_in_parallel_total );
+ printf("partiton_level_parallism = %12.4f\n",
+ (float)partiton_reqs_in_parallel / gpu_sim_cycle);
+ printf("partiton_level_parallism_total = %12.4f\n",
+ (float)(partiton_reqs_in_parallel + partiton_reqs_in_parallel_total) /
+ (gpu_tot_sim_cycle + gpu_sim_cycle));
+ // printf("partiton_reqs_in_parallel_util = %lld\n",
+ // partiton_reqs_in_parallel_util);
+ // printf("partiton_reqs_in_parallel_util_total = %lld\n",
+ // partiton_reqs_in_parallel_util_total ); printf("gpu_sim_cycle_parition_util
+ // = %lld\n", gpu_sim_cycle_parition_util);
+ // printf("gpu_tot_sim_cycle_parition_util = %lld\n",
+ // gpu_tot_sim_cycle_parition_util );
+ printf("partiton_level_parallism_util = %12.4f\n",
+ (float)partiton_reqs_in_parallel_util / gpu_sim_cycle_parition_util);
+ printf("partiton_level_parallism_util_total = %12.4f\n",
+ (float)(partiton_reqs_in_parallel_util +
+ partiton_reqs_in_parallel_util_total) /
+ (gpu_sim_cycle_parition_util + gpu_tot_sim_cycle_parition_util));
+ // printf("partiton_replys_in_parallel = %lld\n",
+ // partiton_replys_in_parallel); printf("partiton_replys_in_parallel_total =
+ // %lld\n", partiton_replys_in_parallel_total );
+ printf("L2_BW = %12.4f GB/Sec\n",
+ ((float)(partiton_replys_in_parallel * 32) /
+ (gpu_sim_cycle * m_config.icnt_period)) /
+ 1000000000);
+ printf("L2_BW_total = %12.4f GB/Sec\n",
+ ((float)((partiton_replys_in_parallel +
+ partiton_replys_in_parallel_total) *
+ 32) /
+ ((gpu_tot_sim_cycle + gpu_sim_cycle) * m_config.icnt_period)) /
+ 1000000000);
- time_t curr_time;
- time(&curr_time);
- unsigned long long elapsed_time = MAX( curr_time - gpgpu_ctx->the_gpgpusim->g_simulation_starttime, 1 );
- printf( "gpu_total_sim_rate=%u\n", (unsigned)( ( gpu_tot_sim_insn + gpu_sim_insn ) / elapsed_time ) );
+ time_t curr_time;
+ time(&curr_time);
+ unsigned long long elapsed_time =
+ MAX(curr_time - gpgpu_ctx->the_gpgpusim->g_simulation_starttime, 1);
+ printf("gpu_total_sim_rate=%u\n",
+ (unsigned)((gpu_tot_sim_insn + gpu_sim_insn) / elapsed_time));
- //shader_print_l1_miss_stat( stdout );
- shader_print_cache_stats(stdout);
+ // shader_print_l1_miss_stat( stdout );
+ shader_print_cache_stats(stdout);
- cache_stats core_cache_stats;
- core_cache_stats.clear();
- for(unsigned i=0; i<m_config.num_cluster(); i++){
- m_cluster[i]->get_cache_stats(core_cache_stats);
- }
- printf("\nTotal_core_cache_stats:\n");
- core_cache_stats.print_stats(stdout, "Total_core_cache_stats_breakdown");
- printf("\nTotal_core_cache_fail_stats:\n");
- core_cache_stats.print_fail_stats(stdout, "Total_core_cache_fail_stats_breakdown");
- shader_print_scheduler_stat( stdout, false );
+ cache_stats core_cache_stats;
+ core_cache_stats.clear();
+ for (unsigned i = 0; i < m_config.num_cluster(); i++) {
+ m_cluster[i]->get_cache_stats(core_cache_stats);
+ }
+ printf("\nTotal_core_cache_stats:\n");
+ core_cache_stats.print_stats(stdout, "Total_core_cache_stats_breakdown");
+ printf("\nTotal_core_cache_fail_stats:\n");
+ core_cache_stats.print_fail_stats(stdout,
+ "Total_core_cache_fail_stats_breakdown");
+ shader_print_scheduler_stat(stdout, false);
- m_shader_stats->print(stdout);
+ m_shader_stats->print(stdout);
#ifdef GPGPUSIM_POWER_MODEL
- if(m_config.g_power_simulation_enabled){
- m_gpgpusim_wrapper->print_power_kernel_stats(gpu_sim_cycle, gpu_tot_sim_cycle, gpu_tot_sim_insn + gpu_sim_insn, kernel_info_str, true );
- mcpat_reset_perf_count(m_gpgpusim_wrapper);
- }
+ if (m_config.g_power_simulation_enabled) {
+ m_gpgpusim_wrapper->print_power_kernel_stats(
+ gpu_sim_cycle, gpu_tot_sim_cycle, gpu_tot_sim_insn + gpu_sim_insn,
+ kernel_info_str, true);
+ mcpat_reset_perf_count(m_gpgpusim_wrapper);
+ }
#endif
- // performance counter that are not local to one shader
- m_memory_stats->memlatstat_print(m_memory_config->m_n_mem,m_memory_config->nbk);
- for (unsigned i=0;i<m_memory_config->m_n_mem;i++)
- m_memory_partition_unit[i]->print(stdout);
+ // performance counter that are not local to one shader
+ m_memory_stats->memlatstat_print(m_memory_config->m_n_mem,
+ m_memory_config->nbk);
+ for (unsigned i = 0; i < m_memory_config->m_n_mem; i++)
+ m_memory_partition_unit[i]->print(stdout);
- // L2 cache stats
- if(!m_memory_config->m_L2_config.disabled()){
- cache_stats l2_stats;
- struct cache_sub_stats l2_css;
- struct cache_sub_stats total_l2_css;
- l2_stats.clear();
- l2_css.clear();
- total_l2_css.clear();
+ // L2 cache stats
+ if (!m_memory_config->m_L2_config.disabled()) {
+ cache_stats l2_stats;
+ struct cache_sub_stats l2_css;
+ struct cache_sub_stats total_l2_css;
+ l2_stats.clear();
+ l2_css.clear();
+ total_l2_css.clear();
- printf("\n========= L2 cache stats =========\n");
- for (unsigned i=0;i<m_memory_config->m_n_mem_sub_partition;i++){
- m_memory_sub_partition[i]->accumulate_L2cache_stats(l2_stats);
- m_memory_sub_partition[i]->get_L2cache_sub_stats(l2_css);
+ printf("\n========= L2 cache stats =========\n");
+ for (unsigned i = 0; i < m_memory_config->m_n_mem_sub_partition; i++) {
+ m_memory_sub_partition[i]->accumulate_L2cache_stats(l2_stats);
+ m_memory_sub_partition[i]->get_L2cache_sub_stats(l2_css);
- fprintf( stdout, "L2_cache_bank[%d]: Access = %llu, Miss = %llu, Miss_rate = %.3lf, Pending_hits = %llu, Reservation_fails = %llu\n",
- i, l2_css.accesses, l2_css.misses, (double)l2_css.misses / (double)l2_css.accesses, l2_css.pending_hits, l2_css.res_fails);
+ fprintf(stdout,
+ "L2_cache_bank[%d]: Access = %llu, Miss = %llu, Miss_rate = "
+ "%.3lf, Pending_hits = %llu, Reservation_fails = %llu\n",
+ i, l2_css.accesses, l2_css.misses,
+ (double)l2_css.misses / (double)l2_css.accesses,
+ l2_css.pending_hits, l2_css.res_fails);
- total_l2_css += l2_css;
- }
- if (!m_memory_config->m_L2_config.disabled() && m_memory_config->m_L2_config.get_num_lines()) {
- //L2c_print_cache_stat();
- printf("L2_total_cache_accesses = %llu\n", total_l2_css.accesses);
- printf("L2_total_cache_misses = %llu\n", total_l2_css.misses);
- if(total_l2_css.accesses > 0)
- printf("L2_total_cache_miss_rate = %.4lf\n", (double)total_l2_css.misses/(double)total_l2_css.accesses);
- printf("L2_total_cache_pending_hits = %llu\n", total_l2_css.pending_hits);
- printf("L2_total_cache_reservation_fails = %llu\n", total_l2_css.res_fails);
- printf("L2_total_cache_breakdown:\n");
- l2_stats.print_stats(stdout, "L2_cache_stats_breakdown");
- printf("L2_total_cache_reservation_fail_breakdown:\n");
- l2_stats.print_fail_stats(stdout, "L2_cache_stats_fail_breakdown");
- total_l2_css.print_port_stats(stdout, "L2_cache");
- }
- }
+ total_l2_css += l2_css;
+ }
+ if (!m_memory_config->m_L2_config.disabled() &&
+ m_memory_config->m_L2_config.get_num_lines()) {
+ // L2c_print_cache_stat();
+ printf("L2_total_cache_accesses = %llu\n", total_l2_css.accesses);
+ printf("L2_total_cache_misses = %llu\n", total_l2_css.misses);
+ if (total_l2_css.accesses > 0)
+ printf("L2_total_cache_miss_rate = %.4lf\n",
+ (double)total_l2_css.misses / (double)total_l2_css.accesses);
+ printf("L2_total_cache_pending_hits = %llu\n", total_l2_css.pending_hits);
+ printf("L2_total_cache_reservation_fails = %llu\n",
+ total_l2_css.res_fails);
+ printf("L2_total_cache_breakdown:\n");
+ l2_stats.print_stats(stdout, "L2_cache_stats_breakdown");
+ printf("L2_total_cache_reservation_fail_breakdown:\n");
+ l2_stats.print_fail_stats(stdout, "L2_cache_stats_fail_breakdown");
+ total_l2_css.print_port_stats(stdout, "L2_cache");
+ }
+ }
- if (m_config.gpgpu_cflog_interval != 0) {
- spill_log_to_file (stdout, 1, gpu_sim_cycle);
- insn_warp_occ_print(stdout);
- }
- if ( gpgpu_ctx->func_sim->gpgpu_ptx_instruction_classification ) {
- StatDisp( gpgpu_ctx->func_sim->g_inst_classification_stat[gpgpu_ctx->func_sim->g_ptx_kernel_count]);
- StatDisp( gpgpu_ctx->func_sim->g_inst_op_classification_stat[gpgpu_ctx->func_sim->g_ptx_kernel_count]);
- }
+ if (m_config.gpgpu_cflog_interval != 0) {
+ spill_log_to_file(stdout, 1, gpu_sim_cycle);
+ insn_warp_occ_print(stdout);
+ }
+ if (gpgpu_ctx->func_sim->gpgpu_ptx_instruction_classification) {
+ StatDisp(gpgpu_ctx->func_sim->g_inst_classification_stat
+ [gpgpu_ctx->func_sim->g_ptx_kernel_count]);
+ StatDisp(gpgpu_ctx->func_sim->g_inst_op_classification_stat
+ [gpgpu_ctx->func_sim->g_ptx_kernel_count]);
+ }
#ifdef GPGPUSIM_POWER_MODEL
- if(m_config.g_power_simulation_enabled){
- m_gpgpusim_wrapper->detect_print_steady_state(1,gpu_tot_sim_insn+gpu_sim_insn);
- }
+ if (m_config.g_power_simulation_enabled) {
+ m_gpgpusim_wrapper->detect_print_steady_state(
+ 1, gpu_tot_sim_insn + gpu_sim_insn);
+ }
#endif
+ // Interconnect power stat print
+ long total_simt_to_mem = 0;
+ long total_mem_to_simt = 0;
+ long temp_stm = 0;
+ long temp_mts = 0;
+ for (unsigned i = 0; i < m_config.num_cluster(); i++) {
+ m_cluster[i]->get_icnt_stats(temp_stm, temp_mts);
+ total_simt_to_mem += temp_stm;
+ total_mem_to_simt += temp_mts;
+ }
+ printf("\nicnt_total_pkts_mem_to_simt=%ld\n", total_mem_to_simt);
+ printf("icnt_total_pkts_simt_to_mem=%ld\n", total_simt_to_mem);
- // Interconnect power stat print
- long total_simt_to_mem=0;
- long total_mem_to_simt=0;
- long temp_stm=0;
- long temp_mts = 0;
- for(unsigned i=0; i<m_config.num_cluster(); i++){
- m_cluster[i]->get_icnt_stats(temp_stm, temp_mts);
- total_simt_to_mem += temp_stm;
- total_mem_to_simt += temp_mts;
- }
- printf("\nicnt_total_pkts_mem_to_simt=%ld\n", total_mem_to_simt);
- printf("icnt_total_pkts_simt_to_mem=%ld\n", total_simt_to_mem);
-
- time_vector_print();
- fflush(stdout);
+ time_vector_print();
+ fflush(stdout);
- clear_executed_kernel_info();
+ clear_executed_kernel_info();
}
-
// performance counter that are not local to one shader
-unsigned gpgpu_sim::threads_per_core() const
-{
- return m_shader_config->n_thread_per_shader;
+unsigned gpgpu_sim::threads_per_core() const {
+ return m_shader_config->n_thread_per_shader;
}
-void shader_core_ctx::mem_instruction_stats(const warp_inst_t &inst)
-{
- unsigned active_count = inst.active_count();
- //this breaks some encapsulation: the is_[space] functions, if you change those, change this.
- switch (inst.space.get_type()) {
+void shader_core_ctx::mem_instruction_stats(const warp_inst_t &inst) {
+ unsigned active_count = inst.active_count();
+ // this breaks some encapsulation: the is_[space] functions, if you change
+ // those, change this.
+ switch (inst.space.get_type()) {
case undefined_space:
case reg_space:
- break;
+ break;
case shared_space:
- m_stats->gpgpu_n_shmem_insn += active_count;
- break;
+ m_stats->gpgpu_n_shmem_insn += active_count;
+ break;
case sstarr_space:
- m_stats->gpgpu_n_sstarr_insn += active_count;
- break;
+ m_stats->gpgpu_n_sstarr_insn += active_count;
+ break;
case const_space:
- m_stats->gpgpu_n_const_insn += active_count;
- break;
+ m_stats->gpgpu_n_const_insn += active_count;
+ break;
case param_space_kernel:
case param_space_local:
- m_stats->gpgpu_n_param_insn += active_count;
- break;
+ m_stats->gpgpu_n_param_insn += active_count;
+ break;
case tex_space:
- m_stats->gpgpu_n_tex_insn += active_count;
- break;
+ m_stats->gpgpu_n_tex_insn += active_count;
+ break;
case global_space:
case local_space:
- if( inst.is_store() )
- m_stats->gpgpu_n_store_insn += active_count;
- else
- m_stats->gpgpu_n_load_insn += active_count;
- break;
+ if (inst.is_store())
+ m_stats->gpgpu_n_store_insn += active_count;
+ else
+ m_stats->gpgpu_n_load_insn += active_count;
+ break;
default:
- abort();
- }
+ abort();
+ }
}
-bool shader_core_ctx::can_issue_1block(kernel_info_t & kernel) {
+bool shader_core_ctx::can_issue_1block(kernel_info_t &kernel) {
+ // Jin: concurrent kernels on one SM
+ if (m_config->gpgpu_concurrent_kernel_sm) {
+ if (m_config->max_cta(kernel) < 1) return false;
- //Jin: concurrent kernels on one SM
- if(m_config->gpgpu_concurrent_kernel_sm) {
- if(m_config->max_cta(kernel) < 1)
- return false;
-
- return occupy_shader_resource_1block(kernel, false);
- }
- else {
- return (get_n_active_cta() < m_config->max_cta(kernel));
- }
+ return occupy_shader_resource_1block(kernel, false);
+ } else {
+ return (get_n_active_cta() < m_config->max_cta(kernel));
+ }
}
int shader_core_ctx::find_available_hwtid(unsigned int cta_size, bool occupy) {
-
- unsigned int step;
- for(step = 0; step < m_config->n_thread_per_shader;
- step += cta_size) {
-
- unsigned int hw_tid;
- for(hw_tid = step; hw_tid < step + cta_size;
- hw_tid++) {
- if(m_occupied_hwtid.test(hw_tid))
- break;
- }
- if(hw_tid == step + cta_size) //consecutive non-active
- break;
- }
- if(step >= m_config->n_thread_per_shader) //didn't find
- return -1;
- else {
- if(occupy) {
- for(unsigned hw_tid = step; hw_tid < step + cta_size;
- hw_tid++)
- m_occupied_hwtid.set(hw_tid);
- }
- return step;
- }
+ unsigned int step;
+ for (step = 0; step < m_config->n_thread_per_shader; step += cta_size) {
+ unsigned int hw_tid;
+ for (hw_tid = step; hw_tid < step + cta_size; hw_tid++) {
+ if (m_occupied_hwtid.test(hw_tid)) break;
+ }
+ if (hw_tid == step + cta_size) // consecutive non-active
+ break;
+ }
+ if (step >= m_config->n_thread_per_shader) // didn't find
+ return -1;
+ else {
+ if (occupy) {
+ for (unsigned hw_tid = step; hw_tid < step + cta_size; hw_tid++)
+ m_occupied_hwtid.set(hw_tid);
+ }
+ return step;
+ }
}
-bool shader_core_ctx::occupy_shader_resource_1block(kernel_info_t & k, bool occupy) {
- unsigned threads_per_cta = k.threads_per_cta();
- const class function_info *kernel = k.entry();
- unsigned int padded_cta_size = threads_per_cta;
- unsigned int warp_size = m_config->warp_size;
- if (padded_cta_size%warp_size)
- padded_cta_size = ((padded_cta_size/warp_size)+1)*(warp_size);
+bool shader_core_ctx::occupy_shader_resource_1block(kernel_info_t &k,
+ bool occupy) {
+ unsigned threads_per_cta = k.threads_per_cta();
+ const class function_info *kernel = k.entry();
+ unsigned int padded_cta_size = threads_per_cta;
+ unsigned int warp_size = m_config->warp_size;
+ if (padded_cta_size % warp_size)
+ padded_cta_size = ((padded_cta_size / warp_size) + 1) * (warp_size);
+
+ if (m_occupied_n_threads + padded_cta_size > m_config->n_thread_per_shader)
+ return false;
- if(m_occupied_n_threads + padded_cta_size > m_config->n_thread_per_shader)
- return false;
+ if (find_available_hwtid(padded_cta_size, false) == -1) return false;
- if(find_available_hwtid(padded_cta_size, false) == -1)
- return false;
+ const struct gpgpu_ptx_sim_info *kernel_info = ptx_sim_kernel_info(kernel);
- const struct gpgpu_ptx_sim_info *kernel_info = ptx_sim_kernel_info(kernel);
+ if (m_occupied_shmem + kernel_info->smem > m_config->gpgpu_shmem_size)
+ return false;
- if(m_occupied_shmem + kernel_info->smem > m_config->gpgpu_shmem_size)
- return false;
+ unsigned int used_regs = padded_cta_size * ((kernel_info->regs + 3) & ~3);
+ if (m_occupied_regs + used_regs > m_config->gpgpu_shader_registers)
+ return false;
- unsigned int used_regs = padded_cta_size * ((kernel_info->regs+3)&~3);
- if(m_occupied_regs + used_regs > m_config->gpgpu_shader_registers)
- return false;
+ if (m_occupied_ctas + 1 > m_config->max_cta_per_core) return false;
- if(m_occupied_ctas +1 > m_config->max_cta_per_core)
- return false;
-
- if(occupy) {
- m_occupied_n_threads += padded_cta_size;
- m_occupied_shmem += kernel_info->smem;
- m_occupied_regs += (padded_cta_size * ((kernel_info->regs+3)&~3));
- m_occupied_ctas++;
+ if (occupy) {
+ m_occupied_n_threads += padded_cta_size;
+ m_occupied_shmem += kernel_info->smem;
+ m_occupied_regs += (padded_cta_size * ((kernel_info->regs + 3) & ~3));
+ m_occupied_ctas++;
- SHADER_DPRINTF(LIVENESS, "GPGPU-Sim uArch: Occupied %u threads, %u shared mem, %u registers, %u ctas\n",
- m_occupied_n_threads, m_occupied_shmem, m_occupied_regs, m_occupied_ctas);
- }
+ SHADER_DPRINTF(LIVENESS,
+ "GPGPU-Sim uArch: Occupied %u threads, %u shared mem, %u "
+ "registers, %u ctas\n",
+ m_occupied_n_threads, m_occupied_shmem, m_occupied_regs,
+ m_occupied_ctas);
+ }
- return true;
+ return true;
}
-void shader_core_ctx::release_shader_resource_1block(unsigned hw_ctaid, kernel_info_t & k) {
+void shader_core_ctx::release_shader_resource_1block(unsigned hw_ctaid,
+ kernel_info_t &k) {
+ if (m_config->gpgpu_concurrent_kernel_sm) {
+ unsigned threads_per_cta = k.threads_per_cta();
+ const class function_info *kernel = k.entry();
+ unsigned int padded_cta_size = threads_per_cta;
+ unsigned int warp_size = m_config->warp_size;
+ if (padded_cta_size % warp_size)
+ padded_cta_size = ((padded_cta_size / warp_size) + 1) * (warp_size);
- if(m_config->gpgpu_concurrent_kernel_sm) {
- unsigned threads_per_cta = k.threads_per_cta();
- const class function_info *kernel = k.entry();
- unsigned int padded_cta_size = threads_per_cta;
- unsigned int warp_size = m_config->warp_size;
- if (padded_cta_size%warp_size)
- padded_cta_size = ((padded_cta_size/warp_size)+1)*(warp_size);
-
- assert(m_occupied_n_threads >= padded_cta_size);
- m_occupied_n_threads -= padded_cta_size;
-
- int start_thread = m_occupied_cta_to_hwtid[hw_ctaid];
-
- for(unsigned hwtid = start_thread; hwtid < start_thread + padded_cta_size;
- hwtid++)
- m_occupied_hwtid.reset(hwtid);
- m_occupied_cta_to_hwtid.erase(hw_ctaid);
-
- const struct gpgpu_ptx_sim_info *kernel_info = ptx_sim_kernel_info(kernel);
-
- assert(m_occupied_shmem >= (unsigned int)kernel_info->smem);
- m_occupied_shmem -= kernel_info->smem;
-
- unsigned int used_regs = padded_cta_size * ((kernel_info->regs+3)&~3);
- assert(m_occupied_regs >= used_regs);
- m_occupied_regs -= used_regs;
-
- assert(m_occupied_ctas >= 1);
- m_occupied_ctas--;
- }
+ assert(m_occupied_n_threads >= padded_cta_size);
+ m_occupied_n_threads -= padded_cta_size;
+
+ int start_thread = m_occupied_cta_to_hwtid[hw_ctaid];
+
+ for (unsigned hwtid = start_thread; hwtid < start_thread + padded_cta_size;
+ hwtid++)
+ m_occupied_hwtid.reset(hwtid);
+ m_occupied_cta_to_hwtid.erase(hw_ctaid);
+
+ const struct gpgpu_ptx_sim_info *kernel_info = ptx_sim_kernel_info(kernel);
+
+ assert(m_occupied_shmem >= (unsigned int)kernel_info->smem);
+ m_occupied_shmem -= kernel_info->smem;
+
+ unsigned int used_regs = padded_cta_size * ((kernel_info->regs + 3) & ~3);
+ assert(m_occupied_regs >= used_regs);
+ m_occupied_regs -= used_regs;
+
+ assert(m_occupied_ctas >= 1);
+ m_occupied_ctas--;
+ }
}
////////////////////////////////////////////////////////////////////////////////////////////////
/**
- * Launches a cooperative thread array (CTA).
- *
- * @param kernel
- * object that tells us which kernel to ask for a CTA from
+ * Launches a cooperative thread array (CTA).
+ *
+ * @param kernel
+ * object that tells us which kernel to ask for a CTA from
*/
-void shader_core_ctx::issue_block2core( kernel_info_t &kernel )
-{
-
- if(!m_config->gpgpu_concurrent_kernel_sm)
- set_max_cta(kernel);
- else
- assert(occupy_shader_resource_1block(kernel, true));
+void shader_core_ctx::issue_block2core(kernel_info_t &kernel) {
+ if (!m_config->gpgpu_concurrent_kernel_sm)
+ set_max_cta(kernel);
+ else
+ assert(occupy_shader_resource_1block(kernel, true));
- kernel.inc_running();
+ kernel.inc_running();
- // find a free CTA context
- unsigned free_cta_hw_id=(unsigned)-1;
+ // find a free CTA context
+ unsigned free_cta_hw_id = (unsigned)-1;
- unsigned max_cta_per_core;
- if(!m_config->gpgpu_concurrent_kernel_sm)
- max_cta_per_core = kernel_max_cta_per_shader;
- else
- max_cta_per_core = m_config->max_cta_per_core;
- for (unsigned i=0;i<max_cta_per_core;i++ ) {
- if( m_cta_status[i]==0 ) {
- free_cta_hw_id=i;
- break;
- }
+ unsigned max_cta_per_core;
+ if (!m_config->gpgpu_concurrent_kernel_sm)
+ max_cta_per_core = kernel_max_cta_per_shader;
+ else
+ max_cta_per_core = m_config->max_cta_per_core;
+ for (unsigned i = 0; i < max_cta_per_core; i++) {
+ if (m_cta_status[i] == 0) {
+ free_cta_hw_id = i;
+ break;
}
- assert( free_cta_hw_id!=(unsigned)-1 );
+ }
+ assert(free_cta_hw_id != (unsigned)-1);
- // determine hardware threads and warps that will be used for this CTA
- int cta_size = kernel.threads_per_cta();
+ // determine hardware threads and warps that will be used for this CTA
+ int cta_size = kernel.threads_per_cta();
- // hw warp id = hw thread id mod warp size, so we need to find a range
- // of hardware thread ids corresponding to an integral number of hardware
- // thread ids
- int padded_cta_size = cta_size;
- if (cta_size%m_config->warp_size)
- padded_cta_size = ((cta_size/m_config->warp_size)+1)*(m_config->warp_size);
+ // hw warp id = hw thread id mod warp size, so we need to find a range
+ // of hardware thread ids corresponding to an integral number of hardware
+ // thread ids
+ int padded_cta_size = cta_size;
+ if (cta_size % m_config->warp_size)
+ padded_cta_size =
+ ((cta_size / m_config->warp_size) + 1) * (m_config->warp_size);
- unsigned int start_thread, end_thread;
+ unsigned int start_thread, end_thread;
- if(!m_config->gpgpu_concurrent_kernel_sm) {
- start_thread = free_cta_hw_id * padded_cta_size;
- end_thread = start_thread + cta_size;
- }
- else {
- start_thread = find_available_hwtid(padded_cta_size, true);
- assert((int)start_thread != -1);
- end_thread = start_thread + cta_size;
- assert(m_occupied_cta_to_hwtid.find(free_cta_hw_id) == m_occupied_cta_to_hwtid.end());
- m_occupied_cta_to_hwtid[free_cta_hw_id]= start_thread;
- }
+ if (!m_config->gpgpu_concurrent_kernel_sm) {
+ start_thread = free_cta_hw_id * padded_cta_size;
+ end_thread = start_thread + cta_size;
+ } else {
+ start_thread = find_available_hwtid(padded_cta_size, true);
+ assert((int)start_thread != -1);
+ end_thread = start_thread + cta_size;
+ assert(m_occupied_cta_to_hwtid.find(free_cta_hw_id) ==
+ m_occupied_cta_to_hwtid.end());
+ m_occupied_cta_to_hwtid[free_cta_hw_id] = start_thread;
+ }
- // reset the microarchitecture state of the selected hardware thread and warp contexts
- reinit(start_thread, end_thread,false);
-
- // initalize scalar threads and determine which hardware warps they are allocated to
- // bind functional simulation state of threads to hardware resources (simulation)
- warp_set_t warps;
- unsigned nthreads_in_block= 0;
- function_info *kernel_func_info = kernel.entry();
- symbol_table * symtab= kernel_func_info->get_symtab();
- unsigned ctaid= kernel.get_next_cta_id_single();
- checkpoint *g_checkpoint= new checkpoint();
- for (unsigned i = start_thread; i<end_thread; i++) {
- m_threadState[i].m_cta_id = free_cta_hw_id;
- unsigned warp_id = i/m_config->warp_size;
+ // reset the microarchitecture state of the selected hardware thread and warp
+ // contexts
+ reinit(start_thread, end_thread, false);
+
+ // initalize scalar threads and determine which hardware warps they are
+ // allocated to bind functional simulation state of threads to hardware
+ // resources (simulation)
+ warp_set_t warps;
+ unsigned nthreads_in_block = 0;
+ function_info *kernel_func_info = kernel.entry();
+ symbol_table *symtab = kernel_func_info->get_symtab();
+ unsigned ctaid = kernel.get_next_cta_id_single();
+ checkpoint *g_checkpoint = new checkpoint();
+ for (unsigned i = start_thread; i < end_thread; i++) {
+ m_threadState[i].m_cta_id = free_cta_hw_id;
+ unsigned warp_id = i / m_config->warp_size;
if(m_gpu->get_config().is_trace_driven_mode()) {
trace_shader_core_ctx* trace_core = static_cast<trace_shader_core_ctx*> (this);
nthreads_in_block += trace_core->trace_sim_inc_thread(kernel);
}
else
- nthreads_in_block += ptx_sim_init_thread(kernel,&m_thread[i],m_sid,i,cta_size-(i-start_thread),m_config->n_thread_per_shader,this,free_cta_hw_id,warp_id,m_cluster->get_gpu());
- m_threadState[i].m_active = true;
- // load thread local memory and register file
- if(m_gpu->resume_option == 1 && kernel.get_uid() == m_gpu->resume_kernel && ctaid >= m_gpu->resume_CTA && ctaid < m_gpu->checkpoint_CTA_t )
- {
- char fname[2048];
- snprintf(fname,2048,"checkpoint_files/thread_%d_%d_reg.txt",i%cta_size,ctaid );
- m_thread[i]->resume_reg_thread(fname,symtab);
- char f1name[2048];
- snprintf(f1name,2048,"checkpoint_files/local_mem_thread_%d_%d_reg.txt",i%cta_size,ctaid);
- g_checkpoint->load_global_mem(m_thread[i]->m_local_mem, f1name);
- }
- //
- warps.set( warp_id );
+ nthreads_in_block += ptx_sim_init_thread(
+ kernel, &m_thread[i], m_sid, i, cta_size - (i - start_thread),
+ m_config->n_thread_per_shader, this, free_cta_hw_id, warp_id,
+ m_cluster->get_gpu());
+ m_threadState[i].m_active = true;
+ // load thread local memory and register file
+ if (m_gpu->resume_option == 1 && kernel.get_uid() == m_gpu->resume_kernel &&
+ ctaid >= m_gpu->resume_CTA && ctaid < m_gpu->checkpoint_CTA_t) {
+ char fname[2048];
+ snprintf(fname, 2048, "checkpoint_files/thread_%d_%d_reg.txt",
+ i % cta_size, ctaid);
+ m_thread[i]->resume_reg_thread(fname, symtab);
+ char f1name[2048];
+ snprintf(f1name, 2048, "checkpoint_files/local_mem_thread_%d_%d_reg.txt",
+ i % cta_size, ctaid);
+ g_checkpoint->load_global_mem(m_thread[i]->m_local_mem, f1name);
}
- assert( nthreads_in_block > 0 && nthreads_in_block <= m_config->n_thread_per_shader); // should be at least one, but less than max
- m_cta_status[free_cta_hw_id]=nthreads_in_block;
+ //
+ warps.set(warp_id);
+ }
+ assert(nthreads_in_block > 0 &&
+ nthreads_in_block <=
+ m_config->n_thread_per_shader); // should be at least one, but
+ // less than max
+ m_cta_status[free_cta_hw_id] = nthreads_in_block;
- if(m_gpu->resume_option == 1 && kernel.get_uid() == m_gpu->resume_kernel && ctaid >= m_gpu->resume_CTA && ctaid < m_gpu->checkpoint_CTA_t )
- {
- char f1name[2048];
- snprintf(f1name,2048,"checkpoint_files/shared_mem_%d.txt", ctaid);
-
- g_checkpoint->load_global_mem(m_thread[start_thread]->m_shared_mem, f1name);
- }
- // now that we know which warps are used in this CTA, we can allocate
- // resources for use in CTA-wide barrier operations
- m_barriers.allocate_barrier(free_cta_hw_id,warps);
+ if (m_gpu->resume_option == 1 && kernel.get_uid() == m_gpu->resume_kernel &&
+ ctaid >= m_gpu->resume_CTA && ctaid < m_gpu->checkpoint_CTA_t) {
+ char f1name[2048];
+ snprintf(f1name, 2048, "checkpoint_files/shared_mem_%d.txt", ctaid);
- // initialize the SIMT stacks and fetch hardware
- init_warps( free_cta_hw_id, start_thread, end_thread, ctaid, cta_size, kernel);
- m_n_active_cta++;
+ g_checkpoint->load_global_mem(m_thread[start_thread]->m_shared_mem, f1name);
+ }
+ // now that we know which warps are used in this CTA, we can allocate
+ // resources for use in CTA-wide barrier operations
+ m_barriers.allocate_barrier(free_cta_hw_id, warps);
- shader_CTA_count_log(m_sid, 1);
- SHADER_DPRINTF(LIVENESS, "GPGPU-Sim uArch: cta:%2u, start_tid:%4u, end_tid:%4u, initialized @(%lld,%lld)\n",
- free_cta_hw_id, start_thread, end_thread, m_gpu->gpu_sim_cycle, m_gpu->gpu_tot_sim_cycle );
+ // initialize the SIMT stacks and fetch hardware
+ init_warps( free_cta_hw_id, start_thread, end_thread, ctaid, cta_size, kernel);
+ m_n_active_cta++;
+ shader_CTA_count_log(m_sid, 1);
+ SHADER_DPRINTF(LIVENESS,
+ "GPGPU-Sim uArch: cta:%2u, start_tid:%4u, end_tid:%4u, "
+ "initialized @(%lld,%lld)\n",
+ free_cta_hw_id, start_thread, end_thread, m_gpu->gpu_sim_cycle,
+ m_gpu->gpu_tot_sim_cycle);
}
///////////////////////////////////////////////////////////////////////////////////////////
-void dram_t::dram_log( int task )
-{
- if (task == SAMPLELOG) {
- StatAddSample(mrqq_Dist, que_length());
- } else if (task == DUMPLOG) {
- printf ("Queue Length DRAM[%d] ",id);StatDisp(mrqq_Dist);
- }
+void dram_t::dram_log(int task) {
+ if (task == SAMPLELOG) {
+ StatAddSample(mrqq_Dist, que_length());
+ } else if (task == DUMPLOG) {
+ printf("Queue Length DRAM[%d] ", id);
+ StatDisp(mrqq_Dist);
+ }
}
-//Find next clock domain and increment its time
-int gpgpu_sim::next_clock_domain(void)
-{
- double smallest = min3(core_time,icnt_time,dram_time);
- int mask = 0x00;
- if ( l2_time <= smallest ) {
- smallest = l2_time;
- mask |= L2 ;
- l2_time += m_config.l2_period;
- }
- if ( icnt_time <= smallest ) {
- mask |= ICNT;
- icnt_time += m_config.icnt_period;
- }
- if ( dram_time <= smallest ) {
- mask |= DRAM;
- dram_time += m_config.dram_period;
- }
- if ( core_time <= smallest ) {
- mask |= CORE;
- core_time += m_config.core_period;
- }
- return mask;
+// Find next clock domain and increment its time
+int gpgpu_sim::next_clock_domain(void) {
+ double smallest = min3(core_time, icnt_time, dram_time);
+ int mask = 0x00;
+ if (l2_time <= smallest) {
+ smallest = l2_time;
+ mask |= L2;
+ l2_time += m_config.l2_period;
+ }
+ if (icnt_time <= smallest) {
+ mask |= ICNT;
+ icnt_time += m_config.icnt_period;
+ }
+ if (dram_time <= smallest) {
+ mask |= DRAM;
+ dram_time += m_config.dram_period;
+ }
+ if (core_time <= smallest) {
+ mask |= CORE;
+ core_time += m_config.core_period;
+ }
+ return mask;
}
-void gpgpu_sim::issue_block2core()
-{
- unsigned last_issued = m_last_cluster_issue;
- for (unsigned i=0;i<m_shader_config->n_simt_clusters;i++) {
- unsigned idx = (i + last_issued + 1) % m_shader_config->n_simt_clusters;
- unsigned num = m_cluster[idx]->issue_block2core();
- if( num ) {
- m_last_cluster_issue=idx;
- m_total_cta_launched += num;
- }
+void gpgpu_sim::issue_block2core() {
+ unsigned last_issued = m_last_cluster_issue;
+ for (unsigned i = 0; i < m_shader_config->n_simt_clusters; i++) {
+ unsigned idx = (i + last_issued + 1) % m_shader_config->n_simt_clusters;
+ unsigned num = m_cluster[idx]->issue_block2core();
+ if (num) {
+ m_last_cluster_issue = idx;
+ m_total_cta_launched += num;
}
+ }
}
-unsigned long long g_single_step=0; // set this in gdb to single step the pipeline
+unsigned long long g_single_step =
+ 0; // set this in gdb to single step the pipeline
-void gpgpu_sim::cycle()
-{
- int clock_mask = next_clock_domain();
+void gpgpu_sim::cycle() {
+ int clock_mask = next_clock_domain();
- if (clock_mask & CORE ) {
- // shader core loading (pop from ICNT into core) follows CORE clock
- for (unsigned i=0;i<m_shader_config->n_simt_clusters;i++)
- m_cluster[i]->icnt_cycle();
- }
- unsigned partiton_replys_in_parallel_per_cycle = 0;
- if (clock_mask & ICNT) {
- // pop from memory controller to interconnect
- for (unsigned i=0;i<m_memory_config->m_n_mem_sub_partition;i++) {
- mem_fetch* mf = m_memory_sub_partition[i]->top();
- if (mf) {
- unsigned response_size = mf->get_is_write()?mf->get_ctrl_size():mf->size();
- if ( ::icnt_has_buffer( m_shader_config->mem2device(i), response_size ) ) {
- //if (!mf->get_is_write())
- mf->set_return_timestamp(gpu_sim_cycle+gpu_tot_sim_cycle);
- mf->set_status(IN_ICNT_TO_SHADER,gpu_sim_cycle+gpu_tot_sim_cycle);
- ::icnt_push( m_shader_config->mem2device(i), mf->get_tpc(), mf, response_size );
- m_memory_sub_partition[i]->pop();
- partiton_replys_in_parallel_per_cycle++;
- } else {
- gpu_stall_icnt2sh++;
- }
- } else {
- m_memory_sub_partition[i]->pop();
- }
+ if (clock_mask & CORE) {
+ // shader core loading (pop from ICNT into core) follows CORE clock
+ for (unsigned i = 0; i < m_shader_config->n_simt_clusters; i++)
+ m_cluster[i]->icnt_cycle();
+ }
+ unsigned partiton_replys_in_parallel_per_cycle = 0;
+ if (clock_mask & ICNT) {
+ // pop from memory controller to interconnect
+ for (unsigned i = 0; i < m_memory_config->m_n_mem_sub_partition; i++) {
+ mem_fetch *mf = m_memory_sub_partition[i]->top();
+ if (mf) {
+ unsigned response_size =
+ mf->get_is_write() ? mf->get_ctrl_size() : mf->size();
+ if (::icnt_has_buffer(m_shader_config->mem2device(i), response_size)) {
+ // if (!mf->get_is_write())
+ mf->set_return_timestamp(gpu_sim_cycle + gpu_tot_sim_cycle);
+ mf->set_status(IN_ICNT_TO_SHADER, gpu_sim_cycle + gpu_tot_sim_cycle);
+ ::icnt_push(m_shader_config->mem2device(i), mf->get_tpc(), mf,
+ response_size);
+ m_memory_sub_partition[i]->pop();
+ partiton_replys_in_parallel_per_cycle++;
+ } else {
+ gpu_stall_icnt2sh++;
}
- }
- partiton_replys_in_parallel += partiton_replys_in_parallel_per_cycle;
-
- if (clock_mask & DRAM) {
- for (unsigned i=0;i<m_memory_config->m_n_mem;i++){
- if(m_memory_config->simple_dram_model)
- m_memory_partition_unit[i]->simple_dram_model_cycle();
- else
- m_memory_partition_unit[i]->dram_cycle(); // Issue the dram command (scheduler + delay model)
- // Update performance counters for DRAM
- m_memory_partition_unit[i]->set_dram_power_stats(m_power_stats->pwr_mem_stat->n_cmd[CURRENT_STAT_IDX][i], m_power_stats->pwr_mem_stat->n_activity[CURRENT_STAT_IDX][i],
- m_power_stats->pwr_mem_stat->n_nop[CURRENT_STAT_IDX][i], m_power_stats->pwr_mem_stat->n_act[CURRENT_STAT_IDX][i], m_power_stats->pwr_mem_stat->n_pre[CURRENT_STAT_IDX][i],
- m_power_stats->pwr_mem_stat->n_rd[CURRENT_STAT_IDX][i], m_power_stats->pwr_mem_stat->n_wr[CURRENT_STAT_IDX][i], m_power_stats->pwr_mem_stat->n_req[CURRENT_STAT_IDX][i]);
+ } else {
+ m_memory_sub_partition[i]->pop();
}
- }
+ }
+ }
+ partiton_replys_in_parallel += partiton_replys_in_parallel_per_cycle;
- // L2 operations follow L2 clock domain
- unsigned partiton_reqs_in_parallel_per_cycle = 0;
- if (clock_mask & L2) {
- m_power_stats->pwr_mem_stat->l2_cache_stats[CURRENT_STAT_IDX].clear();
- for (unsigned i=0;i<m_memory_config->m_n_mem_sub_partition;i++) {
- //move memory request from interconnect into memory partition (if not backed up)
- //Note:This needs to be called in DRAM clock domain if there is no L2 cache in the system
- //In the worst case, we may need to push SECTOR_CHUNCK_SIZE requests, so ensure you have enough buffer for them
- if ( m_memory_sub_partition[i]->full(SECTOR_CHUNCK_SIZE) ) {
- gpu_stall_dramfull++;
- } else {
- mem_fetch* mf = (mem_fetch*) icnt_pop( m_shader_config->mem2device(i) );
- m_memory_sub_partition[i]->push( mf, gpu_sim_cycle + gpu_tot_sim_cycle );
- if(mf)
- partiton_reqs_in_parallel_per_cycle++;
- }
- m_memory_sub_partition[i]->cache_cycle(gpu_sim_cycle+gpu_tot_sim_cycle);
- m_memory_sub_partition[i]->accumulate_L2cache_stats(m_power_stats->pwr_mem_stat->l2_cache_stats[CURRENT_STAT_IDX]);
- }
- }
- partiton_reqs_in_parallel += partiton_reqs_in_parallel_per_cycle;
- if(partiton_reqs_in_parallel_per_cycle > 0){
- partiton_reqs_in_parallel_util += partiton_reqs_in_parallel_per_cycle;
- gpu_sim_cycle_parition_util++;
- }
+ if (clock_mask & DRAM) {
+ for (unsigned i = 0; i < m_memory_config->m_n_mem; i++) {
+ if (m_memory_config->simple_dram_model)
+ m_memory_partition_unit[i]->simple_dram_model_cycle();
+ else
+ m_memory_partition_unit[i]
+ ->dram_cycle(); // Issue the dram command (scheduler + delay model)
+ // Update performance counters for DRAM
+ m_memory_partition_unit[i]->set_dram_power_stats(
+ m_power_stats->pwr_mem_stat->n_cmd[CURRENT_STAT_IDX][i],
+ m_power_stats->pwr_mem_stat->n_activity[CURRENT_STAT_IDX][i],
+ m_power_stats->pwr_mem_stat->n_nop[CURRENT_STAT_IDX][i],
+ m_power_stats->pwr_mem_stat->n_act[CURRENT_STAT_IDX][i],
+ m_power_stats->pwr_mem_stat->n_pre[CURRENT_STAT_IDX][i],
+ m_power_stats->pwr_mem_stat->n_rd[CURRENT_STAT_IDX][i],
+ m_power_stats->pwr_mem_stat->n_wr[CURRENT_STAT_IDX][i],
+ m_power_stats->pwr_mem_stat->n_req[CURRENT_STAT_IDX][i]);
+ }
+ }
- if (clock_mask & ICNT) {
- icnt_transfer();
- }
+ // L2 operations follow L2 clock domain
+ unsigned partiton_reqs_in_parallel_per_cycle = 0;
+ if (clock_mask & L2) {
+ m_power_stats->pwr_mem_stat->l2_cache_stats[CURRENT_STAT_IDX].clear();
+ for (unsigned i = 0; i < m_memory_config->m_n_mem_sub_partition; i++) {
+ // move memory request from interconnect into memory partition (if not
+ // backed up) Note:This needs to be called in DRAM clock domain if there
+ // is no L2 cache in the system In the worst case, we may need to push
+ // SECTOR_CHUNCK_SIZE requests, so ensure you have enough buffer for them
+ if (m_memory_sub_partition[i]->full(SECTOR_CHUNCK_SIZE)) {
+ gpu_stall_dramfull++;
+ } else {
+ mem_fetch *mf = (mem_fetch *)icnt_pop(m_shader_config->mem2device(i));
+ m_memory_sub_partition[i]->push(mf, gpu_sim_cycle + gpu_tot_sim_cycle);
+ if (mf) partiton_reqs_in_parallel_per_cycle++;
+ }
+ m_memory_sub_partition[i]->cache_cycle(gpu_sim_cycle + gpu_tot_sim_cycle);
+ m_memory_sub_partition[i]->accumulate_L2cache_stats(
+ m_power_stats->pwr_mem_stat->l2_cache_stats[CURRENT_STAT_IDX]);
+ }
+ }
+ partiton_reqs_in_parallel += partiton_reqs_in_parallel_per_cycle;
+ if (partiton_reqs_in_parallel_per_cycle > 0) {
+ partiton_reqs_in_parallel_util += partiton_reqs_in_parallel_per_cycle;
+ gpu_sim_cycle_parition_util++;
+ }
- if (clock_mask & CORE) {
- // L1 cache + shader core pipeline stages
- m_power_stats->pwr_mem_stat->core_cache_stats[CURRENT_STAT_IDX].clear();
- for (unsigned i=0;i<m_shader_config->n_simt_clusters;i++) {
- if (m_cluster[i]->get_not_completed() || get_more_cta_left() ) {
- m_cluster[i]->core_cycle();
- *active_sms+=m_cluster[i]->get_n_active_sms();
- }
- // Update core icnt/cache stats for GPUWattch
- m_cluster[i]->get_icnt_stats(m_power_stats->pwr_mem_stat->n_simt_to_mem[CURRENT_STAT_IDX][i], m_power_stats->pwr_mem_stat->n_mem_to_simt[CURRENT_STAT_IDX][i]);
- m_cluster[i]->get_cache_stats(m_power_stats->pwr_mem_stat->core_cache_stats[CURRENT_STAT_IDX]);
- m_cluster[i]->get_current_occupancy(gpu_occupancy.aggregate_warp_slot_filled, gpu_occupancy.aggregate_theoretical_warp_slots);
+ if (clock_mask & ICNT) {
+ icnt_transfer();
+ }
+ if (clock_mask & CORE) {
+ // L1 cache + shader core pipeline stages
+ m_power_stats->pwr_mem_stat->core_cache_stats[CURRENT_STAT_IDX].clear();
+ for (unsigned i = 0; i < m_shader_config->n_simt_clusters; i++) {
+ if (m_cluster[i]->get_not_completed() || get_more_cta_left()) {
+ m_cluster[i]->core_cycle();
+ *active_sms += m_cluster[i]->get_n_active_sms();
}
- float temp=0;
- for (unsigned i=0;i<m_shader_config->num_shader();i++){
- temp+=m_shader_stats->m_pipeline_duty_cycle[i];
- }
- temp=temp/m_shader_config->num_shader();
- *average_pipeline_duty_cycle=((*average_pipeline_duty_cycle)+temp);
- //cout<<"Average pipeline duty cycle: "<<*average_pipeline_duty_cycle<<endl;
+ // Update core icnt/cache stats for GPUWattch
+ m_cluster[i]->get_icnt_stats(
+ m_power_stats->pwr_mem_stat->n_simt_to_mem[CURRENT_STAT_IDX][i],
+ m_power_stats->pwr_mem_stat->n_mem_to_simt[CURRENT_STAT_IDX][i]);
+ m_cluster[i]->get_cache_stats(
+ m_power_stats->pwr_mem_stat->core_cache_stats[CURRENT_STAT_IDX]);
+ m_cluster[i]->get_current_occupancy(
+ gpu_occupancy.aggregate_warp_slot_filled,
+ gpu_occupancy.aggregate_theoretical_warp_slots);
+ }
+ float temp = 0;
+ for (unsigned i = 0; i < m_shader_config->num_shader(); i++) {
+ temp += m_shader_stats->m_pipeline_duty_cycle[i];
+ }
+ temp = temp / m_shader_config->num_shader();
+ *average_pipeline_duty_cycle = ((*average_pipeline_duty_cycle) + temp);
+ // cout<<"Average pipeline duty cycle:
+ // "<<*average_pipeline_duty_cycle<<endl;
+ if (g_single_step &&
+ ((gpu_sim_cycle + gpu_tot_sim_cycle) >= g_single_step)) {
+ raise(SIGTRAP); // Debug breakpoint
+ }
+ gpu_sim_cycle++;
- if( g_single_step && ((gpu_sim_cycle+gpu_tot_sim_cycle) >= g_single_step) ) {
- raise(SIGTRAP); // Debug breakpoint
- }
- gpu_sim_cycle++;
-
- if( g_interactive_debugger_enabled )
- gpgpu_debug();
+ if (g_interactive_debugger_enabled) gpgpu_debug();
// McPAT main cycle (interface with McPAT)
#ifdef GPGPUSIM_POWER_MODEL
- if(m_config.g_power_simulation_enabled){
- mcpat_cycle(m_config, getShaderCoreConfig(), m_gpgpusim_wrapper, m_power_stats, m_config.gpu_stat_sample_freq, gpu_tot_sim_cycle, gpu_sim_cycle, gpu_tot_sim_insn, gpu_sim_insn);
- }
+ if (m_config.g_power_simulation_enabled) {
+ mcpat_cycle(m_config, getShaderCoreConfig(), m_gpgpusim_wrapper,
+ m_power_stats, m_config.gpu_stat_sample_freq,
+ gpu_tot_sim_cycle, gpu_sim_cycle, gpu_tot_sim_insn,
+ gpu_sim_insn);
+ }
#endif
- issue_block2core();
+ issue_block2core();
decrement_kernel_latency();
-
- // Depending on configuration, invalidate the caches once all of threads are completed.
- int all_threads_complete = 1;
- if (m_config.gpgpu_flush_l1_cache) {
- for (unsigned i=0;i<m_shader_config->n_simt_clusters;i++) {
- if (m_cluster[i]->get_not_completed() == 0)
- m_cluster[i]->cache_invalidate();
- else
- all_threads_complete = 0 ;
- }
+
+ // Depending on configuration, invalidate the caches once all of threads are
+ // completed.
+ int all_threads_complete = 1;
+ if (m_config.gpgpu_flush_l1_cache) {
+ for (unsigned i = 0; i < m_shader_config->n_simt_clusters; i++) {
+ if (m_cluster[i]->get_not_completed() == 0)
+ m_cluster[i]->cache_invalidate();
+ else
+ all_threads_complete = 0;
}
+ }
- if(m_config.gpgpu_flush_l2_cache){
- if(!m_config.gpgpu_flush_l1_cache){
- for (unsigned i=0;i<m_shader_config->n_simt_clusters;i++) {
- if (m_cluster[i]->get_not_completed() != 0){
- all_threads_complete = 0 ;
- break;
- }
- }
+ if (m_config.gpgpu_flush_l2_cache) {
+ if (!m_config.gpgpu_flush_l1_cache) {
+ for (unsigned i = 0; i < m_shader_config->n_simt_clusters; i++) {
+ if (m_cluster[i]->get_not_completed() != 0) {
+ all_threads_complete = 0;
+ break;
}
+ }
+ }
- if (all_threads_complete && !m_memory_config->m_L2_config.disabled() ) {
- printf("Flushed L2 caches...\n");
- if (m_memory_config->m_L2_config.get_num_lines()) {
- int dlc = 0;
- for (unsigned i=0;i<m_memory_config->m_n_mem;i++) {
- dlc = m_memory_sub_partition[i]->flushL2();
- assert (dlc == 0); // TODO: need to model actual writes to DRAM here
- printf("Dirty lines flushed from L2 %d is %d\n", i, dlc );
- }
- }
- }
+ if (all_threads_complete && !m_memory_config->m_L2_config.disabled()) {
+ printf("Flushed L2 caches...\n");
+ if (m_memory_config->m_L2_config.get_num_lines()) {
+ int dlc = 0;
+ for (unsigned i = 0; i < m_memory_config->m_n_mem; i++) {
+ dlc = m_memory_sub_partition[i]->flushL2();
+ assert(dlc == 0); // TODO: need to model actual writes to DRAM here
+ printf("Dirty lines flushed from L2 %d is %d\n", i, dlc);
+ }
+ }
}
+ }
- if (!(gpu_sim_cycle % m_config.gpu_stat_sample_freq)) {
- time_t days, hrs, minutes, sec;
- time_t curr_time;
- time(&curr_time);
- unsigned long long elapsed_time = MAX(curr_time - gpgpu_ctx->the_gpgpusim->g_simulation_starttime, 1);
- if ( (elapsed_time - last_liveness_message_time) >= m_config.liveness_message_freq && DTRACE(LIVENESS) ) {
- days = elapsed_time/(3600*24);
- hrs = elapsed_time/3600 - 24*days;
- minutes = elapsed_time/60 - 60*(hrs + 24*days);
- sec = elapsed_time - 60*(minutes + 60*(hrs + 24*days));
-
- unsigned long long active = 0, total = 0;
- for (unsigned i=0;i<m_shader_config->n_simt_clusters;i++) {
- m_cluster[i]->get_current_occupancy(active, total);
- }
- DPRINTFG(LIVENESS, "uArch: inst.: %lld (ipc=%4.1f, occ=%0.4f\% [%llu / %llu]) sim_rate=%u (inst/sec) elapsed = %u:%u:%02u:%02u / %s",
- gpu_tot_sim_insn + gpu_sim_insn,
- (double)gpu_sim_insn/(double)gpu_sim_cycle,
- float(active)/float(total) * 100, active, total,
- (unsigned)((gpu_tot_sim_insn+gpu_sim_insn) / elapsed_time),
- (unsigned)days,(unsigned)hrs,(unsigned)minutes,(unsigned)sec,
- ctime(&curr_time));
- fflush(stdout);
- last_liveness_message_time = elapsed_time;
- }
- visualizer_printstat();
- m_memory_stats->memlatstat_lat_pw();
- if (m_config.gpgpu_runtime_stat && (m_config.gpu_runtime_stat_flag != 0) ) {
- if (m_config.gpu_runtime_stat_flag & GPU_RSTAT_BW_STAT) {
- for (unsigned i=0;i<m_memory_config->m_n_mem;i++)
- m_memory_partition_unit[i]->print_stat(stdout);
- printf("maxmrqlatency = %d \n", m_memory_stats->max_mrq_latency);
- printf("maxmflatency = %d \n", m_memory_stats->max_mf_latency);
- }
- if (m_config.gpu_runtime_stat_flag & GPU_RSTAT_SHD_INFO)
- shader_print_runtime_stat( stdout );
- if (m_config.gpu_runtime_stat_flag & GPU_RSTAT_L1MISS)
- shader_print_l1_miss_stat( stdout );
- if (m_config.gpu_runtime_stat_flag & GPU_RSTAT_SCHED)
- shader_print_scheduler_stat( stdout, false );
- }
+ if (!(gpu_sim_cycle % m_config.gpu_stat_sample_freq)) {
+ time_t days, hrs, minutes, sec;
+ time_t curr_time;
+ time(&curr_time);
+ unsigned long long elapsed_time =
+ MAX(curr_time - gpgpu_ctx->the_gpgpusim->g_simulation_starttime, 1);
+ if ((elapsed_time - last_liveness_message_time) >=
+ m_config.liveness_message_freq &&
+ DTRACE(LIVENESS)) {
+ days = elapsed_time / (3600 * 24);
+ hrs = elapsed_time / 3600 - 24 * days;
+ minutes = elapsed_time / 60 - 60 * (hrs + 24 * days);
+ sec = elapsed_time - 60 * (minutes + 60 * (hrs + 24 * days));
+
+ unsigned long long active = 0, total = 0;
+ for (unsigned i = 0; i < m_shader_config->n_simt_clusters; i++) {
+ m_cluster[i]->get_current_occupancy(active, total);
+ }
+ DPRINTFG(LIVENESS,
+ "uArch: inst.: %lld (ipc=%4.1f, occ=%0.4f\% [%llu / %llu]) "
+ "sim_rate=%u (inst/sec) elapsed = %u:%u:%02u:%02u / %s",
+ gpu_tot_sim_insn + gpu_sim_insn,
+ (double)gpu_sim_insn / (double)gpu_sim_cycle,
+ float(active) / float(total) * 100, active, total,
+ (unsigned)((gpu_tot_sim_insn + gpu_sim_insn) / elapsed_time),
+ (unsigned)days, (unsigned)hrs, (unsigned)minutes,
+ (unsigned)sec, ctime(&curr_time));
+ fflush(stdout);
+ last_liveness_message_time = elapsed_time;
+ }
+ visualizer_printstat();
+ m_memory_stats->memlatstat_lat_pw();
+ if (m_config.gpgpu_runtime_stat &&
+ (m_config.gpu_runtime_stat_flag != 0)) {
+ if (m_config.gpu_runtime_stat_flag & GPU_RSTAT_BW_STAT) {
+ for (unsigned i = 0; i < m_memory_config->m_n_mem; i++)
+ m_memory_partition_unit[i]->print_stat(stdout);
+ printf("maxmrqlatency = %d \n", m_memory_stats->max_mrq_latency);
+ printf("maxmflatency = %d \n", m_memory_stats->max_mf_latency);
+ }
+ if (m_config.gpu_runtime_stat_flag & GPU_RSTAT_SHD_INFO)
+ shader_print_runtime_stat(stdout);
+ if (m_config.gpu_runtime_stat_flag & GPU_RSTAT_L1MISS)
+ shader_print_l1_miss_stat(stdout);
+ if (m_config.gpu_runtime_stat_flag & GPU_RSTAT_SCHED)
+ shader_print_scheduler_stat(stdout, false);
}
+ }
- if (!(gpu_sim_cycle % 50000)) {
- // deadlock detection
- if (m_config.gpu_deadlock_detect && gpu_sim_insn == last_gpu_sim_insn) {
- gpu_deadlock = true;
- } else {
- last_gpu_sim_insn = gpu_sim_insn;
- }
+ if (!(gpu_sim_cycle % 50000)) {
+ // deadlock detection
+ if (m_config.gpu_deadlock_detect && gpu_sim_insn == last_gpu_sim_insn) {
+ gpu_deadlock = true;
+ } else {
+ last_gpu_sim_insn = gpu_sim_insn;
}
- try_snap_shot(gpu_sim_cycle);
- spill_log_to_file (stdout, 0, gpu_sim_cycle);
+ }
+ try_snap_shot(gpu_sim_cycle);
+ spill_log_to_file(stdout, 0, gpu_sim_cycle);
#if (CUDART_VERSION >= 5000)
- //launch device kernel
- gpgpu_ctx->device_runtime->launch_one_device_kernel();
+ // launch device kernel
+ gpgpu_ctx->device_runtime->launch_one_device_kernel();
#endif
- }
+ }
}
-
-void shader_core_ctx::dump_warp_state( FILE *fout ) const
-{
- fprintf(fout, "\n");
- fprintf(fout, "per warp functional simulation status:\n");
- for (unsigned w=0; w < m_config->max_warps_per_shader; w++ )
- m_warp[w].print(fout);
+void shader_core_ctx::dump_warp_state(FILE *fout) const {
+ fprintf(fout, "\n");
+ fprintf(fout, "per warp functional simulation status:\n");
+ for (unsigned w = 0; w < m_config->max_warps_per_shader; w++)
+ m_warp[w].print(fout);
}
-
-void gpgpu_sim::perf_memcpy_to_gpu( size_t dst_start_addr, size_t count )
-{
- if (m_memory_config->m_perf_sim_memcpy) {
+void gpgpu_sim::perf_memcpy_to_gpu(size_t dst_start_addr, size_t count) {
+ if (m_memory_config->m_perf_sim_memcpy) {
//if(!m_config.trace_driven_mode) //in trace-driven mode, CUDA runtime can start nre data structure at any position
// assert (dst_start_addr % 32 == 0);
- for ( unsigned counter = 0; counter < count; counter += 32 ) {
- const unsigned wr_addr = dst_start_addr + counter;
- addrdec_t raw_addr;
- mem_access_sector_mask_t mask;
- mask.set(wr_addr % 128 / 32);
- m_memory_config->m_address_mapping.addrdec_tlx( wr_addr, &raw_addr );
- const unsigned partition_id = raw_addr.sub_partition / m_memory_config->m_n_sub_partition_per_memory_channel;
- m_memory_partition_unit[ partition_id ]->handle_memcpy_to_gpu( wr_addr, raw_addr.sub_partition, mask );
- }
+ for (unsigned counter = 0; counter < count; counter += 32) {
+ const unsigned wr_addr = dst_start_addr + counter;
+ addrdec_t raw_addr;
+ mem_access_sector_mask_t mask;
+ mask.set(wr_addr % 128 / 32);
+ m_memory_config->m_address_mapping.addrdec_tlx(wr_addr, &raw_addr);
+ const unsigned partition_id =
+ raw_addr.sub_partition /
+ m_memory_config->m_n_sub_partition_per_memory_channel;
+ m_memory_partition_unit[partition_id]->handle_memcpy_to_gpu(
+ wr_addr, raw_addr.sub_partition, mask);
}
+ }
}
-void gpgpu_sim::dump_pipeline( int mask, int s, int m ) const
-{
-/*
- You may want to use this function while running GPGPU-Sim in gdb.
- One way to do that is add the following to your .gdbinit file:
-
- define dp
- call g_the_gpu.dump_pipeline_impl((0x40|0x4|0x1),$arg0,0)
- end
-
- Then, typing "dp 3" will show the contents of the pipeline for shader core 3.
-*/
+void gpgpu_sim::dump_pipeline(int mask, int s, int m) const {
+ /*
+ You may want to use this function while running GPGPU-Sim in gdb.
+ One way to do that is add the following to your .gdbinit file:
- printf("Dumping pipeline state...\n");
- if(!mask) mask = 0xFFFFFFFF;
- for (unsigned i=0;i<m_shader_config->n_simt_clusters;i++) {
- if(s != -1) {
- i = s;
- }
- if(mask&1) m_cluster[m_shader_config->sid_to_cluster(i)]->display_pipeline(i,stdout,1,mask & 0x2E);
- if(s != -1) {
- break;
+ define dp
+ call g_the_gpu.dump_pipeline_impl((0x40|0x4|0x1),$arg0,0)
+ end
+
+ Then, typing "dp 3" will show the contents of the pipeline for shader
+ core 3.
+ */
+
+ printf("Dumping pipeline state...\n");
+ if (!mask) mask = 0xFFFFFFFF;
+ for (unsigned i = 0; i < m_shader_config->n_simt_clusters; i++) {
+ if (s != -1) {
+ i = s;
+ }
+ if (mask & 1)
+ m_cluster[m_shader_config->sid_to_cluster(i)]->display_pipeline(
+ i, stdout, 1, mask & 0x2E);
+ if (s != -1) {
+ break;
+ }
+ }
+ if (mask & 0x10000) {
+ for (unsigned i = 0; i < m_memory_config->m_n_mem; i++) {
+ if (m != -1) {
+ i = m;
}
- }
- if(mask&0x10000) {
- for (unsigned i=0;i<m_memory_config->m_n_mem;i++) {
- if(m != -1) {
- i=m;
- }
- printf("DRAM / memory controller %u:\n", i);
- if(mask&0x100000) m_memory_partition_unit[i]->print_stat(stdout);
- if(mask&0x1000000) m_memory_partition_unit[i]->visualize();
- if(mask&0x10000000) m_memory_partition_unit[i]->print(stdout);
- if(m != -1) {
- break;
- }
+ printf("DRAM / memory controller %u:\n", i);
+ if (mask & 0x100000) m_memory_partition_unit[i]->print_stat(stdout);
+ if (mask & 0x1000000) m_memory_partition_unit[i]->visualize();
+ if (mask & 0x10000000) m_memory_partition_unit[i]->print(stdout);
+ if (m != -1) {
+ break;
}
- }
- fflush(stdout);
-}
-
-const shader_core_config * gpgpu_sim::getShaderCoreConfig()
-{
- return m_shader_config;
+ }
+ }
+ fflush(stdout);
}
-const memory_config * gpgpu_sim::getMemoryConfig()
-{
- return m_memory_config;
+const shader_core_config *gpgpu_sim::getShaderCoreConfig() {
+ return m_shader_config;
}
-simt_core_cluster * gpgpu_sim::getSIMTCluster()
-{
- return *m_cluster;
-}
+const memory_config *gpgpu_sim::getMemoryConfig() { return m_memory_config; }
+simt_core_cluster *gpgpu_sim::getSIMTCluster() { return *m_cluster; }