Пример #1
0
extern "C" void *
GOMP_OFFLOAD_dev2host (int device, void *host_ptr, const void *tgt_ptr,
		       size_t size)
{
  TRACE ("(host_ptr = %p, tgt_ptr = %p, size = %d)", host_ptr, tgt_ptr, size);
  if (!size)
    return host_ptr;

  VarDesc vd1[2] = { vd_host2tgt, vd_host2tgt };
  vd1[0].ptr = &tgt_ptr;
  vd1[0].size = sizeof (void *);
  vd1[1].ptr = &size;
  vd1[1].size = sizeof (size);
  VarDesc2 vd1g[2] = { { "tgt_ptr", 0 }, { "size", 0 } };

  offload (__FILE__, __LINE__, device, "__offload_target_tgt2host_p1", 2,
	   vd1, vd1g);

  VarDesc vd2 = vd_tgt2host;
  vd2.ptr = (void *) host_ptr;
  vd2.size = size;
  VarDesc2 vd2g = { "var", 0 };

  offload (__FILE__, __LINE__, device, "__offload_target_tgt2host_p2", 1,
	   &vd2, &vd2g);

  return host_ptr;
}
Пример #2
0
static void
get_target_table (int device, int &num_funcs, int &num_vars, void **&table)
{
  VarDesc vd1[2] = { vd_tgt2host, vd_tgt2host };
  vd1[0].ptr = &num_funcs;
  vd1[0].size = sizeof (num_funcs);
  vd1[1].ptr = &num_vars;
  vd1[1].size = sizeof (num_vars);
  VarDesc2 vd1g[2] = { { "num_funcs", 0 }, { "num_vars", 0 } };

  offload (__FILE__, __LINE__, device, "__offload_target_table_p1", 2,
	   vd1, vd1g);

  int table_size = num_funcs + 2 * num_vars;
  if (table_size > 0)
    {
      table = new void * [table_size];

      VarDesc vd2;
      vd2 = vd_tgt2host;
      vd2.ptr = table;
      vd2.size = table_size * sizeof (void *);
      VarDesc2 vd2g = { "table", 0 };

      offload (__FILE__, __LINE__, device, "__offload_target_table_p2", 1,
	       &vd2, &vd2g);
    }
}
Пример #3
0
/* Load offload_target_main on target.  */
extern "C" void
GOMP_OFFLOAD_init_device (int device)
{
  TRACE ("");
  pthread_once (&main_image_is_registered, register_main_image);
  offload (__FILE__, __LINE__, device, "__offload_target_init_proc", 0,
	   NULL, NULL);
}
Пример #4
0
extern "C" void
GOMP_OFFLOAD_free (int device, void *tgt_ptr)
{
  TRACE ("(tgt_ptr = %p)", tgt_ptr);

  VarDesc vd1 = vd_host2tgt;
  vd1.ptr = &tgt_ptr;
  vd1.size = sizeof (void *);
  VarDesc2 vd1g = { "tgt_ptr", 0 };

  offload (__FILE__, __LINE__, device, "__offload_target_free", 1, &vd1, &vd1g);
}
Пример #5
0
extern "C" void
GOMP_OFFLOAD_run (int device, void *tgt_fn, void *tgt_vars)
{
  TRACE ("(tgt_fn = %p, tgt_vars = %p)", tgt_fn, tgt_vars);

  VarDesc vd1[2] = { vd_host2tgt, vd_host2tgt };
  vd1[0].ptr = &tgt_fn;
  vd1[0].size = sizeof (void *);
  vd1[1].ptr = &tgt_vars;
  vd1[1].size = sizeof (void *);
  VarDesc2 vd1g[2] = { { "tgt_fn", 0 }, { "tgt_vars", 0 } };

  offload (__FILE__, __LINE__, device, "__offload_target_run", 2, vd1, vd1g);
}
Пример #6
0
extern "C" void *
GOMP_OFFLOAD_alloc (int device, size_t size)
{
  TRACE ("(size = %d)", size);

  void *tgt_ptr;
  VarDesc vd1[2] = { vd_host2tgt, vd_tgt2host };
  vd1[0].ptr = &size;
  vd1[0].size = sizeof (size);
  vd1[1].ptr = &tgt_ptr;
  vd1[1].size = sizeof (void *);
  VarDesc2 vd1g[2] = { { "size", 0 }, { "tgt_ptr", 0 } };

  offload (__FILE__, __LINE__, device, "__offload_target_alloc", 2, vd1, vd1g);

  return tgt_ptr;
}
Пример #7
0
int sc_main(int ac, char *av[])
{

  //!  ISA simulator
  // Cria todos os modulos
  mips1 mips1_proc0("mips0");
  mips1 mips1_proc1("mips1");
  mips1 mips1_proc2("mips2");
  mips1 mips1_proc3("mips3");
  mips1 mips1_proc4("mips4");
  mips1 mips1_proc5("mips5");
  mips1 mips1_proc6("mips6");
  mips1 mips1_proc7("mips7");
  ac_tlm_mem mem("mem");
  ac_tlm_bus bus("bus");
  ac_tlm_mutex mutex("mutex");
  ac_tlm_offload offload("offload");

#ifdef AC_DEBUG
  ac_trace("mips1_proc0.trace");
  ac_trace("mips1_proc1.trace");
  ac_trace("mips1_proc2.trace");
  ac_trace("mips1_proc3.trace");
  ac_trace("mips1_proc4.trace");
  ac_trace("mips1_proc5.trace");
  ac_trace("mips1_proc6.trace");
  ac_trace("mips1_proc7.trace");
#endif 

  // Conecta as CPUs as bus
  mips1_proc0.DM_port(bus.cpu0_target_export);
  mips1_proc1.DM_port(bus.cpu1_target_export);
  mips1_proc2.DM_port(bus.cpu2_target_export);
  mips1_proc3.DM_port(bus.cpu3_target_export);
  mips1_proc4.DM_port(bus.cpu4_target_export);
  mips1_proc5.DM_port(bus.cpu5_target_export);
  mips1_proc6.DM_port(bus.cpu6_target_export);
  mips1_proc7.DM_port(bus.cpu7_target_export);

  // Conecta a bus aos outros modulos
  bus.mem_port(mem.target_export);
  bus.mutex_port(mutex.target_export);
  bus.offload_port(offload.target_export);

  // Gera argc e argv para os processadores

  char **av2 = (char **)malloc(ac*sizeof(char *));
  for(int i = 0; i < ac; i++)
      av2[i] = (char *)malloc(strlen(av[i])*sizeof(char));
  
  avcpy(ac, av2, av);
  mips1_proc0.init(ac, av2);
  avcpy(ac, av2, av);
  mips1_proc1.init(ac, av2);
  avcpy(ac, av2, av);
  mips1_proc2.init(ac, av2);
  avcpy(ac, av2, av);
  mips1_proc3.init(ac, av2);
  avcpy(ac, av2, av);
  mips1_proc4.init(ac, av2);
  avcpy(ac, av2, av);
  mips1_proc5.init(ac, av2);
  avcpy(ac, av2, av);
  mips1_proc6.init(ac, av2);
  avcpy(ac, av2, av);
  mips1_proc7.init(ac, av2);
  cerr << endl;

  sc_start();

  mips1_proc0.PrintStat();
  mips1_proc1.PrintStat();
  mips1_proc2.PrintStat();
  mips1_proc3.PrintStat();
  mips1_proc4.PrintStat();
  mips1_proc5.PrintStat();
  mips1_proc6.PrintStat();
  mips1_proc7.PrintStat();
  cerr << endl;

#ifdef AC_STATS
  mips1_proc0.ac_sim_stats.time = sc_simulation_time();
  mips1_proc0.ac_sim_stats.print();
  mips1_proc1.ac_sim_stats.print();
  mips1_proc2.ac_sim_stats.print();
  mips1_proc3.ac_sim_stats.print();
  mips1_proc4.ac_sim_stats.print();
  mips1_proc5.ac_sim_stats.print();
  mips1_proc6.ac_sim_stats.print();
  mips1_proc7.ac_sim_stats.print();
#endif 

#ifdef AC_DEBUG
  ac_close_trace();
#endif 

  return mips1_proc0.ac_exit_status;
}