static int master(int argc, char *argv[]) { long number_of_tasks = xbt_str_parse_int(argv[1], "Invalid amount of tasks: %s"); double task_comp_size = xbt_str_parse_double(argv[2], "Invalid computational size: %s"); double task_comm_size = xbt_str_parse_double(argv[3], "Invalid communication size: %s"); long workers_count = xbt_str_parse_int(argv[4], "Invalid amount of workers: %s"); //setting the variable "is_master" (previously declared) to value 1 TRACE_host_variable_set(MSG_host_get_name(MSG_host_self()), "is_master", 1); TRACE_mark("msmark", "start_send_tasks"); for (int i = 0; i < number_of_tasks; i++) { msg_task_t task = NULL; task = MSG_task_create("task", task_comp_size, task_comm_size, NULL); //setting the variable "task_creation" to value i TRACE_host_variable_set(MSG_host_get_name(MSG_host_self()), "task_creation", i); //setting the category of task to "compute" //the category of a task must be defined before it is sent or executed MSG_task_set_category(task, "compute"); MSG_task_send(task, "master_mailbox"); } TRACE_mark("msmark", "finish_send_tasks"); for (int i = 0; i < workers_count; i++) { msg_task_t finalize = MSG_task_create("finalize", 0, 0, 0); MSG_task_set_category(finalize, "finalize"); MSG_task_send(finalize, "master_mailbox"); } return 0; }
/** Emitter function */ int master(int argc, char *argv[]) { long number_of_tasks = atol(argv[1]); double task_comp_size = atof(argv[2]); double task_comm_size = atof(argv[3]); long slaves_count = atol(argv[4]); //setting the variable "is_master" (previously declared) to value 1 TRACE_host_variable_set("is_master", 1); TRACE_mark("msmark", "start_send_tasks"); int i; for (i = 0; i < number_of_tasks; i++) { m_task_t task = NULL; task = MSG_task_create("task", task_comp_size, task_comm_size, NULL); //setting the variable "task_creation" to value i TRACE_host_variable_set("task_creation", i); //setting the category of task to "compute" //the category of a task must be defined before it is sent or executed TRACE_msg_set_task_category(task, "compute"); MSG_task_send(task, "master_mailbox"); } TRACE_mark("msmark", "finish_send_tasks"); for (i = 0; i < slaves_count; i++) { m_task_t finalize = MSG_task_create("finalize", 0, 0, 0); TRACE_msg_set_task_category(finalize, "finalize"); MSG_task_send(finalize, "master_mailbox"); } return 0; }
/** Receiver function */ int slave(int argc, char *argv[]) { msg_task_t task = NULL; int a; int id = 0; #ifdef HAVE_LATENCY_BOUND_TRACKING int limited_latency = 0; #endif double remaining = 0; char id_alias[10]; if (argc != 2) { XBT_INFO("Strange number of arguments expected 1 got %d", argc - 1); } id = atoi(argv[1]); sprintf(id_alias, "%d", id); int trace_id = id; a = MSG_task_receive(&(task), id_alias); count_finished--; if(count_finished == 0){ timer_start = 0; } if (a != MSG_OK) { XBT_INFO("Hey?! What's up?"); xbt_die("Unexpected behavior."); } elapsed_time = MSG_get_clock() - start_time; if (!bool_printed) { bool_printed = 1; for (id = 0; id < NTASKS; id++) { if (gl_task_array[id] == NULL) continue; if (gl_task_array[id] == task) { #ifdef HAVE_LATENCY_BOUND_TRACKING limited_latency = MSG_task_is_latency_bounded(gl_task_array[id]); if (limited_latency) { XBT_INFO("WARNING FLOW[%d] is limited by latency!!", id); } #endif XBT_INFO ("===> Estimated Bw of FLOW[%d] : %f ; message from %s to %s with remaining : %f", id, gl_data_size[id] / elapsed_time, masternames[id], slavenames[id], 0.0); MSG_task_destroy(gl_task_array[id]); gl_task_array[id]=NULL; } else { remaining = MSG_task_get_remaining_communication(gl_task_array[id]); #ifdef HAVE_LATENCY_BOUND_TRACKING limited_latency = MSG_task_is_latency_bounded(gl_task_array[id]); if (limited_latency) { XBT_INFO("WARNING FLOW[%d] is limited by latency!!", id); } #endif XBT_INFO ("===> Estimated Bw of FLOW[%d] : %f ; message from %s to %s with remaining : %f", id, (gl_data_size[id] - remaining) / elapsed_time, masternames[id], slavenames[id], remaining); if(remaining==0) { MSG_task_destroy(gl_task_array[id]); gl_task_array[id]=NULL; } } } bool_printed = 2; } char mark[100]; snprintf(mark, 100, "flow_%d_finished", trace_id); TRACE_mark("endmark", mark); if(bool_printed==2 && gl_task_array[trace_id]) MSG_task_destroy(gl_task_array[trace_id]); return 0; } /* end_of_slave */