summaryrefslogtreecommitdiff
path: root/src/gpgpu-sim/visualizer.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/gpgpu-sim/visualizer.cc')
-rw-r--r--src/gpgpu-sim/visualizer.cc602
1 files changed, 602 insertions, 0 deletions
diff --git a/src/gpgpu-sim/visualizer.cc b/src/gpgpu-sim/visualizer.cc
new file mode 100644
index 0000000..3772fc2
--- /dev/null
+++ b/src/gpgpu-sim/visualizer.cc
@@ -0,0 +1,602 @@
+/*
+ * Copyright © 2009 by Tor M. Aamodt, Wilson W. L. Fung and the University of
+ * British Columbia, Vancouver, BC V6T 1Z4, All Rights Reserved.
+ *
+ * THIS IS A LEGAL DOCUMENT BY DOWNLOADING GPGPU-SIM, YOU ARE AGREEING TO THESE
+ * TERMS AND CONDITIONS.
+ *
+ * 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 OWNERS 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.
+ *
+ * NOTE: The files libcuda/cuda_runtime_api.c and src/cuda-sim/cuda-math.h
+ * are derived from the CUDA Toolset available from http://www.nvidia.com/cuda
+ * (property of NVIDIA). The files benchmarks/BlackScholes/ and
+ * benchmarks/template/ are derived from the CUDA SDK available from
+ * http://www.nvidia.com/cuda (also property of NVIDIA). The files from
+ * src/intersim/ are derived from Booksim (a simulator provided with the
+ * textbook "Principles and Practices of Interconnection Networks" available
+ * from http://cva.stanford.edu/books/ppin/). As such, those files are bound by
+ * the corresponding legal terms and conditions set forth separately (original
+ * copyright notices are left in files from these sources and where we have
+ * modified a file our copyright notice appears before the original copyright
+ * notice).
+ *
+ * Using this version of GPGPU-Sim requires a complete installation of CUDA
+ * which is distributed seperately by NVIDIA under separate terms and
+ * conditions. To use this version of GPGPU-Sim with OpenCL requires a
+ * recent version of NVIDIA's drivers which support OpenCL.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * 3. 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.
+ *
+ * 4. This version of GPGPU-SIM is distributed freely for non-commercial use only.
+ *
+ * 5. No nonprofit user may place any restrictions on the use of this software,
+ * including as modified by the user, by any other authorized user.
+ *
+ * 6. GPGPU-SIM was developed primarily by Tor M. Aamodt, Wilson W. L. Fung,
+ * Ali Bakhoda, George L. Yuan, at the University of British Columbia,
+ * Vancouver, BC V6T 1Z4
+ */
+
+#include "gpu-sim.h"
+#include "../option_parser.h"
+#include <time.h>
+#include <string.h>
+#include <zlib.h>
+
+extern unsigned int gpu_n_shader;
+extern unsigned int gpu_n_mem;
+extern unsigned int gpu_mem_n_bk;
+extern shader_core_ctx_t **sc;
+extern dram_t **dram;
+extern unsigned int L1_read_miss;
+extern unsigned int L1_write_miss;
+extern unsigned int L1_texture_miss;
+extern unsigned int L1_const_miss;
+extern unsigned L2_write_miss;
+extern unsigned L2_write_hit;
+extern unsigned L2_read_hit;
+extern unsigned L2_read_miss;
+extern unsigned long long int mf_total_lat;
+extern unsigned num_mfs;
+extern unsigned long long gpu_sim_cycle;
+extern unsigned long long gpu_sim_insn;
+extern unsigned long long gpu_tot_sim_insn;
+extern unsigned long long gpu_completed_thread;
+extern unsigned int gpgpu_n_sent_writes;
+extern unsigned int gpgpu_n_processed_writes;
+extern unsigned int gpgpu_n_cache_bkconflict;
+extern unsigned int gpgpu_n_shmem_bkconflict;
+extern unsigned int gpu_stall_by_MSHRwb;
+extern unsigned int *max_return_queue_length;
+extern unsigned max_mrq_latency;
+extern unsigned max_dq_latency;
+extern unsigned max_mf_latency;
+extern unsigned max_icnt2mem_latency;
+extern unsigned max_icnt2sh_latency;
+extern int gpgpu_warpdistro_shader;
+extern unsigned ***mem_access_type_stats;
+
+extern unsigned int warp_size;
+extern unsigned int *shader_cycle_distro;
+void time_vector_print_interval2file(FILE *outfile);
+void time_vector_print_interval2gzfile(gzFile outfile);
+void cflog_visualizer_gzprint(gzFile fout);
+void shader_CTA_count_visualizer_gzprint(gzFile fout);
+float shd_cache_windowed_cache_miss_rate(shd_cache_t*, int);
+void shd_cache_new_window(shd_cache_t*);
+
+int g_visualizer_enabled = 1;
+char *g_visualizer_filename = NULL;
+int g_visualizer_zlevel = 6;
+
+void visualizer_options(option_parser_t opp)
+{
+ 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");
+
+}
+
+void visualizer_printstat()
+{
+ static unsigned int *last_shader_cycle_distro = NULL;
+ gzFile visualizer_file = NULL; // gzFile is basically a pointer to a struct, so it is fine to initialize it as NULL
+ unsigned i;
+ if ( !g_visualizer_enabled )
+ return;
+ if (!last_shader_cycle_distro)
+ last_shader_cycle_distro = (unsigned int*) calloc(warp_size + 3, sizeof(unsigned int));
+
+ if ( g_visualizer_filename == NULL ) {
+ time_t curr_time;
+ time(&curr_time);
+ char *date = ctime(&curr_time);
+ char *s = date;
+ while (*s) {
+ if (*s == ' ' || *s == '\t' || *s == ':') *s = '-';
+ if (*s == '\n' || *s == '\r' ) *s = 0;
+ s++;
+ }
+ char buf[1024];
+ snprintf(buf,1024,"gpgpusim_visualizer__%s.log.gz",date);
+ visualizer_file = gzopen(buf, "w");
+ if (visualizer_file == NULL) {
+ printf("error - could not open visualizer trace file.\n");
+ exit(1);
+ }
+ gzsetparams(visualizer_file, g_visualizer_zlevel, Z_DEFAULT_STRATEGY);
+ g_visualizer_filename = strdup(buf);
+ } else {
+ visualizer_file = gzopen(g_visualizer_filename,"a");
+ if (visualizer_file == NULL) {
+ printf("error - could not open visualizer trace file.\n");
+ exit(1);
+ }
+ gzsetparams(visualizer_file, g_visualizer_zlevel, Z_DEFAULT_STRATEGY);
+ }
+
+ // instruction count per shader core
+ gzprintf(visualizer_file, "shaderinsncount: ");
+ for (i=0;i<gpu_n_shader;i++) {
+ gzprintf(visualizer_file, "%u ",sc[i]->num_sim_insn);
+ }
+ gzprintf(visualizer_file, "\n");
+
+ // warp divergence per shader core
+ gzprintf(visualizer_file, "shaderwarpdiv: ");
+ for (i=0;i<gpu_n_shader;i++) {
+ gzprintf(visualizer_file, "%u ", sc[i]->n_diverge);
+ }
+ gzprintf(visualizer_file, "\n");
+
+ cflog_visualizer_gzprint(visualizer_file);
+ shader_CTA_count_visualizer_gzprint(visualizer_file);
+
+ // per shader core cache miss rate
+ gzprintf(visualizer_file, "CacheMissRate_GlobalLocalL1_All: ");
+ for (i=0;i<gpu_n_shader;i++) {
+ gzprintf(visualizer_file, "%0.4f ", shd_cache_windowed_cache_miss_rate(sc[i]->L1cache, 0));
+ }
+ gzprintf(visualizer_file, "\n");
+
+ gzprintf(visualizer_file, "CacheMissRate_TextureL1_All: ");
+ for (i=0;i<gpu_n_shader;i++) {
+ gzprintf(visualizer_file, "%0.4f ", shd_cache_windowed_cache_miss_rate(sc[i]->L1texcache, 0));
+ }
+ gzprintf(visualizer_file, "\n");
+
+ gzprintf(visualizer_file, "CacheMissRate_ConstL1_All: ");
+ for (i=0;i<gpu_n_shader;i++) {
+ gzprintf(visualizer_file, "%0.4f ", shd_cache_windowed_cache_miss_rate(sc[i]->L1constcache, 0));
+ }
+ gzprintf(visualizer_file, "\n");
+
+ gzprintf(visualizer_file, "CacheMissRate_GlobalLocalL1_noMgHt: ");
+ for (i=0;i<gpu_n_shader;i++) {
+ gzprintf(visualizer_file, "%0.4f ", shd_cache_windowed_cache_miss_rate(sc[i]->L1cache, 1));
+ }
+ gzprintf(visualizer_file, "\n");
+
+ gzprintf(visualizer_file, "CacheMissRate_TextureL1_noMgHt: ");
+ for (i=0;i<gpu_n_shader;i++) {
+ gzprintf(visualizer_file, "%0.4f ", shd_cache_windowed_cache_miss_rate(sc[i]->L1texcache, 1));
+ }
+ gzprintf(visualizer_file, "\n");
+
+ gzprintf(visualizer_file, "CacheMissRate_ConstL1_noMgHt: ");
+ for (i=0;i<gpu_n_shader;i++) {
+ gzprintf(visualizer_file, "%0.4f ", shd_cache_windowed_cache_miss_rate(sc[i]->L1constcache, 1));
+ }
+ gzprintf(visualizer_file, "\n");
+
+ // reset for next interval
+ for (i=0;i<gpu_n_shader;i++) {
+ shd_cache_new_window(sc[i]->L1cache);
+ shd_cache_new_window(sc[i]->L1texcache);
+ shd_cache_new_window(sc[i]->L1constcache);
+ }
+
+ // dram specific statistics
+ for (i=0;i<gpu_n_mem;i++) {
+ gzprintf(visualizer_file, "dramncmd: %u %u\n",dram[i]->id, dram[i]->n_cmd_partial);
+ gzprintf(visualizer_file, "dramnop: %u %u\n",dram[i]->id,dram[i]->n_nop_partial);
+ gzprintf(visualizer_file,"dramnact: %u %u\n",dram[i]->id,dram[i]->n_act_partial);
+ gzprintf(visualizer_file,"dramnpre: %u %u\n",dram[i]->id,dram[i]->n_pre_partial);
+ gzprintf(visualizer_file,"dramnreq: %u %u\n",dram[i]->id,dram[i]->n_req_partial);
+ gzprintf(visualizer_file,"dramavemrqs: %u %u\n",dram[i]->id,
+ dram[i]->n_cmd_partial?(dram[i]->ave_mrqs_partial/dram[i]->n_cmd_partial ):0);
+
+ // utilization and efficiency
+ gzprintf(visualizer_file,"dramutil: %u %u\n",
+ dram[i]->id,dram[i]->n_cmd_partial?100*dram[i]->bwutil_partial/dram[i]->n_cmd_partial:0);
+ gzprintf(visualizer_file,"drameff: %u %u\n",
+ dram[i]->id,dram[i]->n_activity_partial?100*dram[i]->bwutil_partial/dram[i]->n_activity_partial:0);
+
+ // reset for next interval
+ dram[i]->bwutil_partial = 0;
+ dram[i]->n_activity_partial = 0;
+ dram[i]->ave_mrqs_partial = 0;
+ dram[i]->n_cmd_partial = 0;
+ dram[i]->n_nop_partial = 0;
+ dram[i]->n_act_partial = 0;
+ dram[i]->n_pre_partial = 0;
+ dram[i]->n_req_partial = 0;
+ }
+
+ // dram access type classification
+ for (i=0;i<gpu_n_mem;i++) {
+ unsigned int j;
+ for (j = 0; j < gpu_mem_n_bk; j++) {
+ gzprintf(visualizer_file,"dramglobal_acc_r: %u %u %u\n", dram[i]->id, j,
+ mem_access_type_stats[GLOBAL_ACC_R][dram[i]->id][j]);
+ gzprintf(visualizer_file,"dramglobal_acc_w: %u %u %u\n", dram[i]->id, j,
+ mem_access_type_stats[GLOBAL_ACC_W][dram[i]->id][j]);
+ gzprintf(visualizer_file,"dramlocal_acc_r: %u %u %u\n", dram[i]->id, j,
+ mem_access_type_stats[LOCAL_ACC_R][dram[i]->id][j]);
+ gzprintf(visualizer_file,"dramlocal_acc_w: %u %u %u\n", dram[i]->id, j,
+ mem_access_type_stats[LOCAL_ACC_W][dram[i]->id][j]);
+ gzprintf(visualizer_file,"dramconst_acc_r: %u %u %u\n", dram[i]->id, j,
+ mem_access_type_stats[CONST_ACC_R][dram[i]->id][j]);
+ gzprintf(visualizer_file,"dramtexture_acc_r: %u %u %u\n", dram[i]->id, j,
+ mem_access_type_stats[TEXTURE_ACC_R][dram[i]->id][j]);
+ }
+ }
+
+ // overall cache miss rates
+ gzprintf(visualizer_file, "Lonetexturemiss: %d\n", L1_texture_miss);
+ gzprintf(visualizer_file, "Loneconstmiss: %d\n", L1_const_miss);
+ gzprintf(visualizer_file, "Lonereadmiss: %d\n", L1_read_miss);
+ gzprintf(visualizer_file, "Lonewritemiss: %d\n", L1_write_miss);
+ gzprintf(visualizer_file, "Ltwowritemiss: %d\n", L2_write_miss);
+ gzprintf(visualizer_file, "Ltwowritehit: %d\n", L2_write_hit);
+ gzprintf(visualizer_file, "Ltworeadmiss: %d\n", L2_read_miss);
+ gzprintf(visualizer_file, "Ltworeadhit: %d\n", L2_read_hit);
+
+ // latency stats
+ if (num_mfs) {
+ gzprintf(visualizer_file, "averagemflatency: %lld\n", mf_total_lat/num_mfs);
+ }
+
+ // other parameters for graphing
+ gzprintf(visualizer_file, "globalcyclecount: %lld\n", gpu_sim_cycle);
+ gzprintf(visualizer_file, "globalinsncount: %lld\n", gpu_sim_insn);
+ gzprintf(visualizer_file, "globaltotinsncount: %lld\n", gpu_tot_sim_insn);
+ gzprintf(visualizer_file, "gpucompletedthreads: %lld\n", gpu_completed_thread);
+ gzprintf(visualizer_file, "gpgpunsentwrites: %d\n", gpgpu_n_sent_writes);
+ gzprintf(visualizer_file, "gpgpunprocessedwrites: %d\n", gpgpu_n_processed_writes);
+ gzprintf(visualizer_file, "gpgpu_n_cache_bkconflict: %d\n", gpgpu_n_cache_bkconflict);
+ gzprintf(visualizer_file, "gpgpu_n_shmem_bkconflict: %d\n", gpgpu_n_shmem_bkconflict);
+ gzprintf(visualizer_file, "gpu_stall_by_MSHRwb: %d\n", gpu_stall_by_MSHRwb);
+
+ // warp divergence breakdown
+ time_vector_print_interval2gzfile(visualizer_file);
+ gzprintf(visualizer_file, "WarpDivergenceBreakdown:");
+ unsigned int total=0;
+ unsigned int cf = (gpgpu_warpdistro_shader==-1)?gpu_n_shader:1;
+ gzprintf(visualizer_file, " %d", (shader_cycle_distro[0] - last_shader_cycle_distro[0]) / cf );
+ gzprintf(visualizer_file, " %d", (shader_cycle_distro[2] - last_shader_cycle_distro[2]) / cf );
+ for (i=0; i<warp_size+3; i++) {
+ if ( i>=3 ) {
+ total += (shader_cycle_distro[i] - last_shader_cycle_distro[i]);
+ if ( ((i-3) % (warp_size/8)) == ((warp_size/8)-1) ) {
+ gzprintf(visualizer_file, " %d", total / cf );
+ total=0;
+ }
+ }
+ last_shader_cycle_distro[i] = shader_cycle_distro[i];
+ }
+ gzprintf(visualizer_file,"\n");
+
+ gzclose(visualizer_file);
+}
+
+#include <list>
+#include <vector>
+#include <iostream>
+#include <map>
+#include"../gpgpu-sim/shader.h"
+class my_time_vector {
+private:
+ std::map< unsigned int, std::vector<long int> > ld_time_map;
+ std::map< unsigned int, std::vector<long int> > st_time_map;
+ unsigned ld_vector_size;
+ unsigned st_vector_size;
+ std::vector<double> ld_time_dist;
+ std::vector<double> st_time_dist;
+
+ std::vector<double> overal_ld_time_dist;
+ std::vector<double> overal_st_time_dist;
+ int overal_ld_count;
+ int overal_st_count;
+
+public:
+ my_time_vector(int ld_size,int st_size){
+ ld_vector_size = ld_size;
+ st_vector_size = st_size;
+ ld_time_dist.resize(ld_size);
+ st_time_dist.resize(st_size);
+ overal_ld_time_dist.resize(ld_size);
+ overal_st_time_dist.resize(st_size);
+ overal_ld_count = 0;
+ overal_st_count= 0;
+ }
+ void update_ld(unsigned int uid,unsigned int slot, long int time) {
+ if ( ld_time_map.find( uid )!=ld_time_map.end() ) {
+ ld_time_map[uid][slot]=time;
+ } else if (slot <= MR_2SH_FQ_POP ) {
+ std::vector<long int> time_vec;
+ time_vec.resize(ld_vector_size);
+ time_vec[slot] = time;
+ ld_time_map[uid] = time_vec;
+ } else {
+ //It's a merged mshr! forget it
+ }
+ }
+ void update_st(unsigned int uid,unsigned int slot, long int time) {
+ if ( st_time_map.find( uid )!=st_time_map.end() ) {
+ st_time_map[uid][slot]=time;
+ } else {
+ std::vector<long int> time_vec;
+ time_vec.resize(st_vector_size);
+ time_vec[slot] = time;
+ st_time_map[uid] = time_vec;
+ }
+ }
+ void check_ld_update(unsigned int uid,unsigned int slot, long int latency) {
+ if ( ld_time_map.find( uid )!=ld_time_map.end() ) {
+ int our_latency = ld_time_map[uid][slot] - ld_time_map[uid][MR_ICNT_PUSHED];
+ assert( our_latency == latency);
+ } else if (slot <= MR_2SH_FQ_POP ) {
+ abort();
+ }
+ }
+ void check_st_update(unsigned int uid,unsigned int slot, long int latency) {
+ if ( st_time_map.find( uid )!=st_time_map.end() ) {
+ int our_latency = st_time_map[uid][slot] - st_time_map[uid][MR_ICNT_PUSHED];
+ assert( our_latency == latency);
+ } else {
+ abort();
+ }
+ }
+private:
+ void calculate_ld_dist(void) {
+ unsigned i,first;
+ long int last_update,diff;
+ int finished_count=0;
+ ld_time_dist.clear();
+ ld_time_dist.resize(ld_vector_size);
+ std::map< unsigned int, std::vector<long int> >::iterator iter, iter_temp;
+ iter =ld_time_map.begin() ;
+ while (iter != ld_time_map.end()) {
+ last_update=0;
+ first=-1;
+ if (!iter->second[MR_WRITEBACK]) {
+ //this request is not done yet skip it!
+ ++iter;
+ continue;
+ }
+ while ( !last_update ) {
+ first++;
+ assert( first < iter->second.size() );
+ last_update = iter->second[first];
+ }
+
+ for ( i=first;i<ld_vector_size;i++ ) {
+ diff = iter->second[i] - last_update;
+ if ( diff>0 ) {
+ ld_time_dist[i]+=diff;
+ last_update = iter->second[i];
+ }
+ }
+ iter_temp = iter;
+ iter++;
+ ld_time_map.erase(iter_temp);
+ finished_count++;
+ }
+ if ( finished_count ) {
+ for ( i=0;i<ld_vector_size;i++ ) {
+ overal_ld_time_dist[i] = (overal_ld_time_dist[i]*overal_ld_count + ld_time_dist[i]) / (overal_ld_count + finished_count);
+ }
+ overal_ld_count += finished_count;
+ for ( i=0;i<ld_vector_size;i++ ) {
+ ld_time_dist[i]/=finished_count;
+ }
+ }
+ }
+
+ void calculate_st_dist(void) {
+ unsigned i,first;
+ long int last_update,diff;
+ int finished_count=0;
+ st_time_dist.clear();
+ st_time_dist.resize(st_vector_size);
+ std::map< unsigned int, std::vector<long int> >::iterator iter,iter_temp;
+ iter =st_time_map.begin() ;
+ while ( iter != st_time_map.end() ) {
+ last_update=0;
+ first=-1;
+ if (!iter->second[MR_2SH_ICNT_PUSHED]) {
+ //this request is not done yet skip it!
+ ++iter;
+ continue;
+ }
+ while ( !last_update ) {
+ first++;
+ assert( first < iter->second.size() );
+ last_update = iter->second[first];
+ }
+
+ for ( i=first;i<st_vector_size;i++ ) {
+ diff = iter->second[i] - last_update;
+ if ( diff>0 ) {
+ st_time_dist[i]+=diff;
+ last_update = iter->second[i];
+ }
+ }
+ iter_temp = iter;
+ iter++;
+ st_time_map.erase(iter_temp);
+ finished_count++;
+ }
+ if ( finished_count ) {
+ for ( i=0;i<st_vector_size;i++ ) {
+ overal_st_time_dist[i] = (overal_st_time_dist[i]*overal_st_count + st_time_dist[i]) / (overal_st_count + finished_count);
+ }
+ overal_st_count += finished_count;
+ for ( i=0;i<st_vector_size;i++ ) {
+ st_time_dist[i]/=finished_count;
+ }
+ }
+ }
+
+public:
+ void clear_time_map_vectors(void) {
+ ld_time_map.clear();
+ st_time_map.clear();
+ }
+ void print_all_ld(void) {
+ unsigned i;
+ std::map< unsigned int, std::vector<long int> >::iterator iter;
+ for ( iter =ld_time_map.begin() ; iter != ld_time_map.end(); ++iter ) {
+ std::cout<<"ld_uid"<<iter->first;
+ for ( i=0;i<ld_vector_size;i++ ) {
+ std::cout<<" "<<iter->second[i];
+ }
+ std::cout<< std::endl;
+ }
+ }
+
+ void print_all_st(void) {
+ unsigned i;
+ std::map< unsigned int, std::vector<long int> >::iterator iter;
+
+ for ( iter =st_time_map.begin() ; iter != st_time_map.end(); ++iter ) {
+ std::cout<<"st_uid"<<iter->first;
+ for ( i=0;i<st_vector_size;i++ ) {
+ std::cout<<" "<<iter->second[i];
+ }
+ std::cout<<std::endl;
+ }
+ }
+
+ void calculate_dist() {
+ calculate_ld_dist();
+ calculate_st_dist();
+ }
+ void print_dist(void) {
+ unsigned i;
+ calculate_dist();
+ std::cout << "LD_mem_lat_dist " ;
+ for ( i=0;i<ld_vector_size;i++ ) {
+ std::cout <<" "<<(int)overal_ld_time_dist[i];
+ }
+ std::cout << std::endl;
+ std::cout << "ST_mem_lat_dist " ;
+ for ( i=0;i<st_vector_size;i++ ) {
+ std::cout <<" "<<(int)overal_st_time_dist[i];
+ }
+ std::cout << std::endl;
+ }
+ void print_to_file(FILE *outfile) {
+ unsigned i;
+ calculate_dist();
+ fprintf (outfile,"LDmemlatdist:") ;
+ for ( i=0;i<ld_vector_size;i++ ) {
+ fprintf (outfile," %d", (int)ld_time_dist[i]);
+ }
+ fprintf (outfile,"\n") ;
+ fprintf (outfile,"STmemlatdist:") ;
+ for ( i=0;i<st_vector_size;i++ ) {
+ fprintf (outfile," %d", (int)st_time_dist[i]);
+ }
+ fprintf (outfile,"\n") ;
+ }
+ void print_to_gzfile(gzFile outfile) {
+ unsigned i;
+ calculate_dist();
+ gzprintf (outfile,"LDmemlatdist:") ;
+ for ( i=0;i<ld_vector_size;i++ ) {
+ gzprintf (outfile," %d", (int)ld_time_dist[i]);
+ }
+ gzprintf (outfile,"\n") ;
+ gzprintf (outfile,"STmemlatdist:") ;
+ for ( i=0;i<st_vector_size;i++ ) {
+ gzprintf (outfile," %d", (int)st_time_dist[i]);
+ }
+ gzprintf (outfile,"\n") ;
+ }
+};
+
+my_time_vector* g_my_time_vector;
+
+void time_vector_create(int ld_size,int st_size) {
+ g_my_time_vector = new my_time_vector(ld_size,st_size);
+}
+
+
+void time_vector_print(void) {
+ g_my_time_vector->print_dist();
+}
+
+
+void time_vector_print_interval2file(FILE *outfile) {
+ g_my_time_vector->print_to_file(outfile);
+}
+
+
+void time_vector_print_interval2gzfile(gzFile outfile) {
+ g_my_time_vector->print_to_gzfile(outfile);
+}
+
+#include "../gpgpu-sim/mem_fetch.h"
+
+void time_vector_update(unsigned int uid,int slot ,long int cycle,int type) {
+ if ( (type == RD_REQ) || (type == REPLY_DATA) ) {
+ g_my_time_vector->update_ld( uid, slot,cycle);
+ } else if ( type == WT_REQ ) {
+ g_my_time_vector->update_st( uid, slot,cycle);
+ } else {
+ abort();
+ }
+}
+
+void check_time_vector_update(unsigned int uid,int slot ,long int latency,int type)
+{
+ if ( (type == RD_REQ) || (type == REPLY_DATA) ) {
+ g_my_time_vector->check_ld_update( uid, slot, latency );
+ } else if ( type == WT_REQ ) {
+ g_my_time_vector->check_st_update( uid, slot, latency );
+ } else {
+ abort();
+ }
+}