Esempio n. 1
0
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();
}
Esempio n. 2
0
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);
	}

}
Esempio n. 3
0
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();
}
Esempio n. 4
0
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);

}
Esempio n. 5
0
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);
}
Esempio n. 6
0
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);
}