static void send_mrsg_data (msg_task_t msg) { char mailbox[MAILBOX_ALIAS_SIZE]; double data_size; size_t my_id; mrsg_task_info_t ti; my_id = get_mrsg_worker_id (MSG_host_self ()); sprintf (mailbox, TASK_MRSG_MAILBOX, get_mrsg_worker_id (MSG_task_get_source (msg)), MSG_process_get_PID (MSG_task_get_sender (msg))); if (mrsg_message_is (msg, SMS_GET_MRSG_CHUNK)) { MSG_task_dsend (MSG_task_create ("DATA-C", 0.0, config_mrsg.mrsg_chunk_size, NULL), mailbox, NULL); } else if (mrsg_message_is (msg, SMS_GET_INTER_MRSG_PAIRS)) { ti = (mrsg_task_info_t) MSG_task_get_data (msg); data_size = job_mrsg.map_output[my_id][ti->mrsg_tid] - ti->map_output_copied[my_id]; MSG_task_dsend (MSG_task_create ("DATA-IP", 0.0, data_size, NULL), mailbox, NULL); } MSG_task_destroy (msg); }
/** @brief Main master function. */ int master (int argc, char* argv[]) { heartbeat_t heartbeat; msg_error_t status; msg_host_t worker; msg_task_t msg = NULL; size_t wid; task_info_t ti; double total_cpu_time = 0.0; double total_task_time = 0.0; print_config (); XBT_INFO ("JOB BEGIN"); XBT_INFO (" "); tasks_log = fopen ("tasks.csv", "w"); fprintf (tasks_log, "task_id,phase,worker_id,time,action,shuffle_end\n"); while (job.tasks_pending[MAP] + job.tasks_pending[REDUCE] > 0) { msg = NULL; status = receive (&msg, MASTER_MAILBOX); if (status == MSG_OK) { worker = MSG_task_get_source (msg); wid = get_worker_id (worker); if (message_is (msg, SMS_HEARTBEAT)) { heartbeat = &job.heartbeats[wid]; if (is_straggler (worker)) { set_speculative_tasks (worker); } else { if (heartbeat->slots_av[MAP] > 0) send_scheduler_task(MAP, wid); if (heartbeat->slots_av[REDUCE] > 0) send_scheduler_task(REDUCE, wid); } } else if (message_is (msg, SMS_TASK_DONE)) { ti = (task_info_t) MSG_task_get_data (msg); if (job.task_status[ti->phase][ti->id] != T_STATUS_DONE) { job.task_status[ti->phase][ti->id] = T_STATUS_DONE; finish_all_task_copies (ti); job.tasks_pending[ti->phase]--; if (job.tasks_pending[ti->phase] <= 0) { XBT_INFO (" "); XBT_INFO ("%s PHASE DONE", (ti->phase==MAP?"MAP":"REDUCE")); XBT_INFO (" "); } ti->finished_time = MSG_get_clock(); ti->elapsed_time = ti->finished_time - ti->start_time; total_task_time += ti->elapsed_time; total_cpu_time += ti->cpu_time; } xbt_free_ref (&ti); } MSG_task_destroy (msg); } } fclose (tasks_log); job.finished = 1; print_config (); print_stats (); XBT_INFO ("JOB END"); XBT_INFO ("\tclock_time: %f", MSG_get_clock()); XBT_INFO ("\ttotal_task_time: %f(%f)", total_task_time, total_task_time / MSG_get_clock()); XBT_INFO ("\ttotal_cpu_time: %f(%f)", total_cpu_time, total_cpu_time / MSG_get_clock()); return 0; }
/* Master Process */ int master(int argc, char *argv[]) { char * key; struct HdmsgHost *hdmsg_host; xbt_dict_cursor_t cursor = NULL; int i = 0; long remaining_inits = 0; long remaining_mappers = 0; long remaining_shufflers = 0; long remaining_reducers = 0; long expected_messages = 0; msg_comm_t res_irecv; msg_task_t task_com; msg_task_t *tasks = xbt_new(msg_task_t, number_of_workers); xbt_dynar_t comms = xbt_dynar_new(sizeof(msg_comm_t), NULL); XBT_INFO("INITIALIZATION BEGIN"); // Initialize processes (mappers, shufflers, and reducers) on each host xbt_dict_foreach(hosts, cursor, key, hdmsg_host) { if (hdmsg_host->is_worker) { MSG_process_create("Init", initializeProcs, NULL, hdmsg_host->host); tasks[remaining_inits] = NULL; res_irecv = MSG_task_irecv(&tasks[remaining_inits], "master"); xbt_dynar_push_as(comms, msg_comm_t, res_irecv); remaining_inits++; } } while (!xbt_dynar_is_empty(comms)) { xbt_dynar_remove_at(comms, MSG_comm_waitany(comms), &res_irecv); task_com = MSG_comm_get_task(res_irecv); if (!strcmp(MSG_task_get_name(task_com), "init_exit")) { msg_host_t h = MSG_task_get_source(task_com); MSG_task_destroy(task_com); const char *host_name = MSG_host_get_name(h); struct HdmsgHost *hdmsg_host = xbt_dict_get(hosts, host_name); remaining_mappers += get_mapper_count(hdmsg_host); remaining_shufflers += get_shuffler_count(hdmsg_host); remaining_reducers += get_reducer_count(hdmsg_host); remaining_inits--; if (remaining_inits == 0) { XBT_INFO("INITIALIZATION COMPLETE"); // Add an extra message to account for the message sent when the shuffle phase begins expected_messages = 1 + remaining_mappers + remaining_shufflers + remaining_reducers; free(tasks); tasks = xbt_new(msg_task_t, expected_messages); for (i = 0; i < expected_messages; i++) { tasks[i] = NULL; res_irecv = MSG_task_irecv(&tasks[i], "master"); xbt_dynar_push_as(comms, msg_comm_t, res_irecv); } XBT_INFO("MAP PHASE BEGIN"); // Activate Mappers xbt_dict_foreach(hosts, cursor, key, hdmsg_host) { activate_mappers(hdmsg_host); } }