void evg_gpu_init(void) { /* Classes */ CLASS_REGISTER(EvgGpu); /* Trace */ evg_trace_category = trace_new_category(); /* Try to open report file */ if (evg_gpu_report_file_name[0] && !file_can_open_for_write(evg_gpu_report_file_name)) fatal("%s: cannot open GPU pipeline report file", evg_gpu_report_file_name); /* Trace */ evg_trace_header("evg.init version=\"%d.%d\" num_compute_units=%d\n", EVG_TRACE_VERSION_MAJOR, EVG_TRACE_VERSION_MINOR, evg_gpu_num_compute_units); /* Create GPU */ evg_gpu = new(EvgGpu); /* Initializations */ evg_periodic_report_init(); evg_uop_init(); /* GPU-REL: read stack faults file */ evg_faults_init(); }
void mod_mshr_record_dump() { for (int i = 0; i < list_count(mem_system->mod_list); i++) { struct mod_t *mod = list_get(mem_system->mod_list, i); if (!mod->mshr_record) continue; fclose(mod->mshr_record->access_record_file); /* Run the script - Load script */ FILE *script_file; char cmd[MAX_PATH_SIZE]; char script_file_name[MAX_PATH_SIZE]; char plot_file_name[MAX_PATH_SIZE]; /* Create plot file */ snprintf(plot_file_name, MAX_PATH_SIZE, "%s_mshr_record.eps", mod->name); if (!file_can_open_for_write(plot_file_name)) { fatal("%s: cannot write GPU occupancy calculation plot", plot_file_name); } int err = 0; /* Generate gnuplot script for Offered Bandwidth */ script_file = file_create_temp(script_file_name, MAX_PATH_SIZE); fprintf(script_file, "set term postscript eps color solid\n"); fprintf(script_file, "set nokey\n"); fprintf(script_file, "set title 'MSHR entry occupation - store - module %s'\n", mod->name); fprintf(script_file, "set ylabel 'MSHR entries '\n"); fprintf(script_file, "set xlabel 'Time (cycles) '\n"); fprintf(script_file, "unset xrange \n"); fprintf(script_file, "unset yrange \n"); fprintf(script_file, "set xtics font \"Helvettica, 8\" " "rotate by 45 offset -1,-1 \n"); fprintf(script_file, "set size 0.65, 0.5\n"); fprintf(script_file, "set grid ytics\n"); /* lt is the color, lw is width, pt is the shape, ps is */ fprintf(script_file, "plot '%s' w points lt 1 " "lw 1 pt 2 ps 1 \n",mod->mshr_record->access_record_file_name); fclose(script_file); /* Plot */ sprintf(cmd, "gnuplot %s > %s", script_file_name, plot_file_name); err = system(cmd); if (err) warning("could not execute gnuplot, when creating network results\n"); /* Remove temporary files */ unlink(mod->mshr_record->access_record_file_name); unlink(script_file_name); } }
void si_gpu_init(void) { /* Try to open report file */ if (si_gpu_report_file_name[0] && !file_can_open_for_write(si_gpu_report_file_name)) fatal("%s: cannot open GPU pipeline report file", si_gpu_report_file_name); /* Read configuration file */ si_config_read(); /* Initializations */ si_gpu_device_init(); si_uop_init(); }
void mem_system_snapshot_dump(struct mem_system_snapshot_t * snapshot) { if (mem_snap_period == 0) return; // Last Load accesses for (int i = 0; i < list_count(snapshot->mem_regions_loads) ; i++) { int * element_value = list_get(snapshot->mem_regions_loads, i); fprintf(snapshot->snapshot_load, "%lld %d %d \n" , snapshot->last_snapshot * mem_snap_period, i * snapshot->mem_snapshot_region_size, * element_value); fprintf(snapshot->snapshot_load, "%lld %d %d \n" , snapshot->last_snapshot * mem_snap_period, (i + 1) * snapshot->mem_snapshot_region_size, * element_value); } fprintf(snapshot->snapshot_load, "\n"); for (int i = 0; i < list_count(snapshot->mem_regions_loads); i++) { int * element_value = list_get(snapshot->mem_regions_loads, i); fprintf(snapshot->snapshot_load, "%lld %d %d \n" , (snapshot->last_snapshot + 1) * mem_snap_period, i * snapshot->mem_snapshot_region_size, * element_value); fprintf(snapshot->snapshot_load, "%lld %d %d \n" , (snapshot->last_snapshot + 1) * mem_snap_period, (i + 1) * snapshot->mem_snapshot_region_size, * element_value); if ( snapshot->max_accesses < * element_value) snapshot->max_accesses = * element_value; * element_value = 0; } fprintf(snapshot->snapshot_load, "\n"); fclose(snapshot->snapshot_load); // Last store Accesses for (int i = 0; i < list_count(snapshot->mem_regions_stores) ; i++) { int * element_value = list_get(snapshot->mem_regions_stores, i); fprintf(snapshot->snapshot_store, "%lld %d %d \n" , snapshot->last_snapshot * mem_snap_period, i * snapshot->mem_snapshot_region_size, * element_value); fprintf(snapshot->snapshot_store, "%lld %d %d \n" , snapshot->last_snapshot * mem_snap_period, (i + 1) * snapshot->mem_snapshot_region_size, * element_value); } fprintf(snapshot->snapshot_store, "\n"); for (int i = 0; i < list_count(snapshot->mem_regions_stores); i++) { int * element_value = list_get(snapshot->mem_regions_stores, i); fprintf(snapshot->snapshot_store, "%lld %d %d \n" , (snapshot->last_snapshot + 1) * mem_snap_period, i * snapshot->mem_snapshot_region_size, * element_value); fprintf(snapshot->snapshot_store, "%lld %d %d \n" , (snapshot->last_snapshot + 1) * mem_snap_period, (i + 1) * snapshot->mem_snapshot_region_size, * element_value); if ( snapshot->max_accesses < * element_value) snapshot->max_accesses = * element_value; * element_value = 0; } fprintf(snapshot->snapshot_store, "\n"); fclose(snapshot->snapshot_store); /* Run the script - Load script */ FILE *load_script_file; char cmd[MAX_PATH_SIZE]; char load_script_file_name[MAX_PATH_SIZE]; char plot_file_name[MAX_PATH_SIZE]; /* Create plot file */ for (int i = 0; i < 4; i++) { if (i < 2) snprintf(plot_file_name, MAX_PATH_SIZE, "%d_%d_%dD_loads.ps", mem_snap_period, snapshot->mem_snapshot_region_size,i+2); else snprintf(plot_file_name, MAX_PATH_SIZE, "%d_%d_%dD_stores.ps", mem_snap_period, snapshot->mem_snapshot_region_size,i); if (!file_can_open_for_write(plot_file_name)) { fatal("%s: cannot write GPU occupancy calculation plot", plot_file_name); } load_script_file = file_create_temp(load_script_file_name, MAX_PATH_SIZE); fprintf(load_script_file, "unset origin\n"); fprintf(load_script_file, "unset label\n"); fprintf(load_script_file, "set term postscript eps enhanced color\n"); fprintf(load_script_file, "set ticslevel 0\n"); fprintf(load_script_file, "set nohidden3d\n"); fprintf(load_script_file, "set size square\n"); fprintf(load_script_file, "unset key\n"); fprintf(load_script_file, "set origin 0,-0.1\n"); switch(i%2) { case 1: /* 3D view */ fprintf(load_script_file, "set view 30,40,0.5\n"); break; case 0: default: /* 2D view */ fprintf(load_script_file, "set view 0,0, 0.5\n"); } fprintf(load_script_file, "set pm3d\n"); fprintf(load_script_file, "set palette defined " "(0 \"white\", 0.0001 \"black\", " "10 \"gray\", 60 \"cyan\", 100 \"blue\")\n"); fprintf(load_script_file, "set colorbox vertical user origin " ".2,.28 size 0.03, 0.26\n"); fprintf(load_script_file, "unset surface\n"); fprintf(load_script_file, "set cbtics font \"Helvettica, 6\"\n"); fprintf(load_script_file, "set xlabel 'Time (cycles)' " "font \"Helvettica, 7\"\n"); fprintf(load_script_file, "set xtics font \"Helvettica, 6\"\n"); fprintf(load_script_file, "set xtics offset -0.5,-0.2\n"); fprintf(load_script_file, "set ylabel 'Address (Hex)' " "rotate by 135 offset 2, 0 font \"Helvettica, 7\"\n"); fprintf(load_script_file, "set ytics offset 1.5,0\n"); // fprintf(load_script_file, "set format y \"%.X\"\n"); fprintf(load_script_file, "set ytics font \"Helvettica, 8\"\n"); fprintf(load_script_file, "set mytics 4\n"); fprintf(load_script_file, "unset ztics\n"); fprintf(load_script_file, "set label \"Number of Accesses\" " "font \"Helvetica,7\" at screen 0.27, " "screen 0.35 rotate by 90\n"); if ( i < 2) fprintf(load_script_file, "splot \"%s\" with lines\n", snapshot->load_file_name); else fprintf(load_script_file, "splot \"%s\" with lines\n", snapshot->store_file_name); fprintf(load_script_file, "unset multiplot\n"); fclose(load_script_file); /* Plot */ sprintf(cmd, "gnuplot %s > %s", load_script_file_name, plot_file_name); int err = system(cmd); if (err) warning("could not execute gnuplot\nEither gnuplot is " "not installed or is not the supported version\n"); /* Remove temporary files */ unlink(load_script_file_name); } unlink(snapshot->load_file_name); unlink(snapshot->store_file_name); }
static void evg_calc_plot_local_mem_per_work_group(void) { FILE *data_file, *script_file; char plot_file_name[MAX_PATH_SIZE]; char data_file_name[MAX_PATH_SIZE]; char script_file_name[MAX_PATH_SIZE]; char cmd[MAX_PATH_SIZE]; int local_mem_per_work_group; int work_items_per_work_group; int registers_per_work_item; int wavefronts_per_work_group; int work_groups_per_compute_unit; int wavefronts_per_compute_unit; int local_mem_step; int err; /* Create plot file */ snprintf(plot_file_name, MAX_PATH_SIZE, "%s.%d.local_mem.eps", evg_gpu_calc_file_name, evg_gpu->ndrange->id); if (!file_can_open_for_write(plot_file_name)) fatal("%s: cannot write GPU occupancy calculation plot", plot_file_name); /* Generate data file */ data_file = file_create_temp(data_file_name, MAX_PATH_SIZE); registers_per_work_item = evg_gpu->ndrange->kernel->bin_file ->enc_dict_entry_evergreen->num_gpr_used; local_mem_step = MAX(1, evg_gpu_local_mem_size / 32); work_items_per_work_group = evg_gpu->ndrange->kernel->local_size; wavefronts_per_work_group = (work_items_per_work_group + evg_emu_wavefront_size - 1) / evg_emu_wavefront_size; for (local_mem_per_work_group = local_mem_step; local_mem_per_work_group <= evg_gpu_local_mem_size; local_mem_per_work_group += local_mem_step) { /* Calculate point */ work_groups_per_compute_unit = evg_calc_get_work_groups_per_compute_unit( work_items_per_work_group, registers_per_work_item, local_mem_per_work_group); wavefronts_per_compute_unit = work_groups_per_compute_unit * wavefronts_per_work_group; /* Dump line to data file */ fprintf(data_file, "%d %d\n", local_mem_per_work_group, wavefronts_per_compute_unit); } fclose(data_file); /* Current data point */ local_mem_per_work_group = evg_gpu->ndrange->local_mem_top; work_groups_per_compute_unit = evg_calc_get_work_groups_per_compute_unit( work_items_per_work_group, registers_per_work_item, local_mem_per_work_group); wavefronts_per_compute_unit = work_groups_per_compute_unit * wavefronts_per_work_group; /* Generate gnuplot script */ script_file = file_create_temp(script_file_name, MAX_PATH_SIZE); fprintf(script_file, "set term postscript eps color solid\n"); fprintf(script_file, "set nokey\n"); fprintf(script_file, "set xlabel 'Local memory used per work-group (KB)'\n"); fprintf(script_file, "set ylabel 'Wavefronts per compute-unit'\n"); fprintf(script_file, "set xrange [0:%d]\n", evg_gpu_local_mem_size / 1024); fprintf(script_file, "set yrange [0:]\n"); fprintf(script_file, "set size 0.65, 0.5\n"); fprintf(script_file, "set grid ytics\n"); fprintf(script_file, "plot '%s' u ($1/1024):2 w linespoints lt 3 lw 5 pt 84 ps 2, ", data_file_name); fprintf(script_file, "'-' u ($1/1024):2 w linespoints lt 1 lw 4 pt 82 ps 2\n%d %d\ne\n", local_mem_per_work_group, wavefronts_per_compute_unit); fclose(script_file); /* Plot */ sprintf(cmd, "gnuplot %s > %s", script_file_name, plot_file_name); err = system(cmd); if (err) warning("could not execute gnuplot\n%s", err_gnuplot_msg); /* Remove temporary files */ unlink(data_file_name); unlink(script_file_name); }
static void si_calc_plot_registers_per_work_item(void) { FILE *data_file, *script_file; char plot_file_name[MAX_PATH_SIZE]; char data_file_name[MAX_PATH_SIZE]; char script_file_name[MAX_PATH_SIZE]; char cmd[MAX_PATH_SIZE]; int local_mem_per_work_group; int work_items_per_work_group; int registers_per_work_item; int wavefronts_per_work_group; int work_groups_per_wavefront_pool; int wavefronts_per_wavefront_pool; int err; /* Create plot file */ snprintf(plot_file_name, MAX_PATH_SIZE, "%s.%d.registers.eps", si_gpu_calc_file_name, si_emu->ndrange->id); if (!file_can_open_for_write(plot_file_name)) { fatal("%s: cannot write GPU occupancy calculation plot", plot_file_name); } /* Generate data file */ data_file = file_create_temp(data_file_name, MAX_PATH_SIZE); local_mem_per_work_group = si_emu->ndrange->local_mem_top; work_items_per_work_group = si_emu->ndrange->local_size; wavefronts_per_work_group = (work_items_per_work_group + si_emu_wavefront_size - 1) / si_emu_wavefront_size; for (registers_per_work_item = 1; registers_per_work_item <= 128; registers_per_work_item += 4) { /* Calculate point */ work_groups_per_wavefront_pool = si_calc_get_work_groups_per_wavefront_pool( work_items_per_work_group, registers_per_work_item, local_mem_per_work_group); wavefronts_per_wavefront_pool = work_groups_per_wavefront_pool * wavefronts_per_work_group; /* Dump line to data file */ fprintf(data_file, "%d %d\n", registers_per_work_item, wavefronts_per_wavefront_pool); } fclose(data_file); /* Current data point */ registers_per_work_item = si_emu->ndrange->num_vgpr_used; work_groups_per_wavefront_pool = si_calc_get_work_groups_per_wavefront_pool( work_items_per_work_group, registers_per_work_item, local_mem_per_work_group); wavefronts_per_wavefront_pool = work_groups_per_wavefront_pool * wavefronts_per_work_group; /* Generate gnuplot script */ script_file = file_create_temp(script_file_name, MAX_PATH_SIZE); fprintf(script_file, "set term postscript eps color solid\n"); fprintf(script_file, "set nokey\n"); fprintf(script_file, "set xlabel 'Registers per work-item'\n"); fprintf(script_file, "set ylabel 'Wavefronts per SIMD'\n"); fprintf(script_file, "set xrange [0:128]\n"); fprintf(script_file, "set yrange [0:]\n"); fprintf(script_file, "set xtics (0,16,32,48,64,80,96,112,128)\n"); fprintf(script_file, "set size 0.65, 0.5\n"); fprintf(script_file, "set grid ytics\n"); fprintf(script_file, "plot '%s' w linespoints lt 3 lw 5 pt 84 ps 2, ", data_file_name); fprintf(script_file, "'-' w linespoints lt 1 lw 4 pt 82 ps 2\n%d " "%d\ne\n", registers_per_work_item, wavefronts_per_wavefront_pool); fclose(script_file); /* Plot */ sprintf(cmd, "gnuplot %s > %s", script_file_name, plot_file_name); err = system(cmd); if (err) warning("could not execute gnuplot\n%s", err_gnuplot_msg); /* Remove temporary files */ unlink(data_file_name); unlink(script_file_name); }