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; }
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); } }
/* 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); }
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); }
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); }
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; }
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; }