X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/abc6c695d534ee87fe91c84038ebbf6b9226575d..b5b953be4c43bad172a39f8917200ed84b534ec5:/examples/msg/pmm/msg_pmm.c diff --git a/examples/msg/pmm/msg_pmm.c b/examples/msg/pmm/msg_pmm.c index 75d0e6e448..5d4f6629ef 100644 --- a/examples/msg/pmm/msg_pmm.c +++ b/examples/msg/pmm/msg_pmm.c @@ -1,34 +1,26 @@ /* pmm - parallel matrix multiplication "double diffusion" */ -/* Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011. The SimGrid Team. +/* Copyright (c) 2006-2015. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ -#include "msg/msg.h" -#include "xbt/matrix.h" -#include "xbt/log.h" -// #define BENCH_THIS_CODE /* Will only work from within the source tree as we require xbt/xbt_os_time.h, that is not public yet) */ -#ifdef BENCH_THIS_CODE +#include "simgrid/msg.h" +#include "xbt/matrix.h" #include "xbt/xbt_os_time.h" -#endif /** @addtogroup MSG_examples * - * - pmm/msg_pmm.c: Parallel Matrix Multiplication is a little - * application. This is something that most MPI developper have - * written during their class, here implemented using MSG instead - * of MPI. + * - pmm/msg_pmm.c: Parallel Matrix Multiplication is a little application. This is something that most MPI + * developers have written during their class, here implemented using MSG instead of MPI. */ -XBT_LOG_NEW_DEFAULT_CATEGORY(msg_pmm, - "Messages specific for this msg example"); +XBT_LOG_NEW_DEFAULT_CATEGORY(msg_pmm, "Messages specific for this msg example"); -/* This example should always be executed using a deployment of - * GRID_SIZE * GRID_SIZE nodes. */ -#define GRID_SIZE 3 /* Modify to adjust the grid's size */ -#define NODE_MATRIX_SIZE 300 /* Ammount of work done by each node*/ +/* This example should always be executed using a deployment of GRID_SIZE * GRID_SIZE nodes. */ +#define GRID_SIZE 3 /* Modify to adjust the grid's size */ +#define NODE_MATRIX_SIZE 300 /* Amount of work done by each node*/ #define GRID_NUM_NODES GRID_SIZE * GRID_SIZE #define MATRIX_SIZE NODE_MATRIX_SIZE * GRID_SIZE @@ -47,7 +39,7 @@ typedef struct s_node_job{ xbt_matrix_t B; } s_node_job_t, *node_job_t; -/** +/* * Structure for recovering results */ typedef struct s_result { @@ -67,16 +59,15 @@ static void task_cleanup(void *arg); int node(int argc, char **argv) { - int k, myid; char my_mbox[MAILBOX_NAME_SIZE]; node_job_t myjob, jobs[GRID_NUM_NODES]; - xbt_matrix_t A, B, C = NULL, sA, sB, sC; + xbt_matrix_t A, B, C, sA, sB, sC; result_t result; xbt_assert(argc != 1, "Wrong number of arguments for this node"); /* Initialize the node's data-structures */ - myid = atoi(argv[1]); + int myid = xbt_str_parse_int(argv[1], "Invalid ID received as first node parameter: %s"); snprintf(my_mbox, MAILBOX_NAME_SIZE - 1, "%d", myid); sC = xbt_matrix_double_new_zeros(NODE_MATRIX_SIZE, NODE_MATRIX_SIZE); @@ -95,13 +86,14 @@ int node(int argc, char **argv) /* Broadcast the rest of the jobs to the other nodes */ broadcast_jobs(jobs + 1); - }else{ + } else { + A = B = C = NULL; /* Avoid warning at compilation */ myjob = wait_job(myid); } /* Multiplication main-loop */ XBT_VERB("Start Multiplication's Main-loop"); - for(k=0; k < GRID_SIZE; k++){ + for (int k=0; k < GRID_SIZE; k++){ if(k == myjob->col){ XBT_VERB("Broadcast sA(%d,%d) to row %d", myjob->row, k, myjob->row); broadcast_matrix(myjob->A, NEIGHBOURS_COUNT, myjob->nodes_in_row); @@ -142,15 +134,12 @@ int node(int argc, char **argv) receive_results(results); /* First add our results */ - xbt_matrix_copy_values(C, sC, NODE_MATRIX_SIZE, NODE_MATRIX_SIZE, - 0, 0, 0, 0, NULL); + xbt_matrix_copy_values(C, sC, NODE_MATRIX_SIZE, NODE_MATRIX_SIZE, 0, 0, 0, 0, NULL); /* Reconstruct the rest of the result matrix */ for (node = 1; node < GRID_NUM_NODES; node++){ - xbt_matrix_copy_values(C, results[node]->sC, - NODE_MATRIX_SIZE, NODE_MATRIX_SIZE, - NODE_MATRIX_SIZE * results[node]->row, - NODE_MATRIX_SIZE * results[node]->col, + xbt_matrix_copy_values(C, results[node]->sC, NODE_MATRIX_SIZE, NODE_MATRIX_SIZE, + NODE_MATRIX_SIZE * results[node]->row, NODE_MATRIX_SIZE * results[node]->col, 0, 0, NULL); xbt_matrix_free(results[node]->sC); xbt_free(results[node]); @@ -158,22 +147,26 @@ int node(int argc, char **argv) //xbt_matrix_dump(C, "C:res", 0, xbt_matrix_dump_display_double); + xbt_matrix_free(A); + xbt_matrix_free(B); + xbt_matrix_free(C); + /* The rest: return the result to node 0 */ }else{ - m_task_t task; + msg_task_t task; XBT_VERB("Multiplication done. Send the sub-result."); result = xbt_new0(s_result_t, 1); result->row = myjob->row; result->col = myjob->col; - result->sC = - xbt_matrix_new_sub(sC, NODE_MATRIX_SIZE, NODE_MATRIX_SIZE, 0, 0, NULL); + result->sC = xbt_matrix_new_sub(sC, NODE_MATRIX_SIZE, NODE_MATRIX_SIZE, 0, 0, NULL); task = MSG_task_create("result",100,100,result); - MSG_task_dsend(task, "0", (void_f_pvoid_t) MSG_task_destroy); + MSG_task_send(task, "0"); } /* Clean up and finish*/ + xbt_matrix_free(sC); xbt_matrix_free(myjob->A); xbt_matrix_free(myjob->B); xbt_free(myjob); @@ -185,29 +178,29 @@ int node(int argc, char **argv) */ static void broadcast_jobs(node_job_t *jobs) { - int node; char node_mbox[MAILBOX_NAME_SIZE]; - m_task_t task; msg_comm_t comms[GRID_NUM_NODES - 1] = {0}; XBT_VERB("Broadcast Jobs"); - for (node = 1; node < GRID_NUM_NODES; node++){ - task = MSG_task_create("Job", 100, 100, jobs[node-1]); + for (int node = 1; node < GRID_NUM_NODES; node++){ + msg_task_t task = MSG_task_create("Job", 100, 100, jobs[node-1]); snprintf(node_mbox, MAILBOX_NAME_SIZE - 1, "%d", node); comms[node-1] = MSG_task_isend(task, node_mbox); } MSG_comm_waitall(comms, GRID_NUM_NODES-1, -1); + for (int node = 1; node < GRID_NUM_NODES; node++) + MSG_comm_destroy(comms[node - 1]); } static node_job_t wait_job(int selfid) { - m_task_t task = NULL; + msg_task_t task = NULL; char self_mbox[MAILBOX_NAME_SIZE]; - node_job_t job; snprintf(self_mbox, MAILBOX_NAME_SIZE - 1, "%d", selfid); - MSG_task_receive(&task, self_mbox); - job = (node_job_t)MSG_task_get_data(task); + msg_error_t err = MSG_task_receive(&task, self_mbox); + xbt_assert(err == MSG_OK, "Error while receiving from %s (%d)", self_mbox, (int)err); + node_job_t job = (node_job_t)MSG_task_get_data(task); MSG_task_destroy(task); XBT_VERB("Got Job (%d,%d)", job->row, job->col); @@ -216,83 +209,69 @@ static node_job_t wait_job(int selfid) static void broadcast_matrix(xbt_matrix_t M, int num_nodes, int *nodes) { - int node; char node_mbox[MAILBOX_NAME_SIZE]; - m_task_t task; - xbt_matrix_t sM; - for(node=0; node < num_nodes; node++){ + for(int node=0; node < num_nodes; node++){ snprintf(node_mbox, MAILBOX_NAME_SIZE - 1, "%d", nodes[node]); - sM = xbt_matrix_new_sub(M, NODE_MATRIX_SIZE, NODE_MATRIX_SIZE, 0, 0, NULL); - task = MSG_task_create("sub-matrix", 100, 100, sM); + xbt_matrix_t sM = xbt_matrix_new_sub(M, NODE_MATRIX_SIZE, NODE_MATRIX_SIZE, 0, 0, NULL); + msg_task_t task = MSG_task_create("sub-matrix", 100, 100, sM); MSG_task_dsend(task, node_mbox, task_cleanup); XBT_DEBUG("sub-matrix sent to %s", node_mbox); } - } static void get_sub_matrix(xbt_matrix_t *sM, int selfid) { - m_task_t task = NULL; + msg_task_t task = NULL; char node_mbox[MAILBOX_NAME_SIZE]; XBT_VERB("Get sub-matrix"); snprintf(node_mbox, MAILBOX_NAME_SIZE - 1, "%d", selfid); - MSG_task_receive(&task, node_mbox); + msg_error_t err = MSG_task_receive(&task, node_mbox); + xbt_assert(err == MSG_OK, "Error while receiving from %s (%d)", node_mbox, (int)err); *sM = (xbt_matrix_t)MSG_task_get_data(task); MSG_task_destroy(task); } static void task_cleanup(void *arg){ - m_task_t task = (m_task_t)arg; + msg_task_t task = (msg_task_t)arg; xbt_matrix_t m = (xbt_matrix_t)MSG_task_get_data(task); xbt_matrix_free(m); MSG_task_destroy(task); } -/** - * \brief Main function. - */ int main(int argc, char *argv[]) { -#ifdef BENCH_THIS_CODE xbt_os_timer_t timer = xbt_os_timer_new(); -#endif - MSG_global_init(&argc, argv); - - char **options = &argv[1]; - const char* platform_file = options[0]; - const char* application_file = options[1]; - - MSG_create_environment(platform_file); + MSG_init(&argc, argv); + MSG_create_environment(argv[1]); MSG_function_register("node", node); - MSG_launch_application(application_file); - -#ifdef BENCH_THIS_CODE - xbt_os_timer_start(timer); -#endif - MSG_error_t res = MSG_main(); -#ifdef BENCH_THIS_CODE - xbt_os_timer_stop(timer); -#endif - XBT_CRITICAL("Simulated time: %g", MSG_get_clock()); + for(int i = 0 ; i< 9; i++) { + char *hostname = bprintf("node-%d.acme.org", i); + char **argvF = xbt_new(char *, 3); + argvF[0] = xbt_strdup("node"); + argvF[1] = bprintf("%d", i); + argvF[2] = NULL; + MSG_process_create_with_arguments("node", node, NULL, MSG_host_by_name(hostname), 2, argvF); + xbt_free(hostname); + } - MSG_clean(); + xbt_os_cputimer_start(timer); + msg_error_t res = MSG_main(); + xbt_os_cputimer_stop(timer); + XBT_CRITICAL("Simulated time: %g", MSG_get_clock()); - if (res == MSG_OK) - return 0; - else - return 1; + return res != MSG_OK; } static void create_jobs(xbt_matrix_t A, xbt_matrix_t B, node_job_t *jobs) { - int node, j, k, row = 0, col = 0; + int row = 0, col = 0; - for (node = 0; node < GRID_NUM_NODES; node++){ + for (int node = 0; node < GRID_NUM_NODES; node++){ XBT_VERB("Create job %d", node); jobs[node] = xbt_new0(s_node_job_t, 1); jobs[node]->row = row; @@ -300,14 +279,14 @@ static void create_jobs(xbt_matrix_t A, xbt_matrix_t B, node_job_t *jobs) /* Compute who are the nodes in the same row and column */ /* than the node receiving this job */ - for (j = 0, k = 0; j < GRID_SIZE; j++) { + for (int j = 0, k = 0; j < GRID_SIZE; j++) { if (node != (GRID_SIZE * row) + j) { jobs[node]->nodes_in_row[k] = (GRID_SIZE * row) + j; k++; } } - for (j = 0, k = 0; j < GRID_SIZE; j++) { + for (int j = 0, k = 0; j < GRID_SIZE; j++) { if (node != (GRID_SIZE * j) + col) { jobs[node]->nodes_in_col[k] = (GRID_SIZE * j) + col; k++; @@ -316,13 +295,9 @@ static void create_jobs(xbt_matrix_t A, xbt_matrix_t B, node_job_t *jobs) /* Assign a sub matrix of A and B to the job */ jobs[node]->A = - xbt_matrix_new_sub(A, NODE_MATRIX_SIZE, NODE_MATRIX_SIZE, - NODE_MATRIX_SIZE * row, NODE_MATRIX_SIZE * col, - NULL); + xbt_matrix_new_sub(A, NODE_MATRIX_SIZE, NODE_MATRIX_SIZE, NODE_MATRIX_SIZE * row, NODE_MATRIX_SIZE * col, NULL); jobs[node]->B = - xbt_matrix_new_sub(B, NODE_MATRIX_SIZE, NODE_MATRIX_SIZE, - NODE_MATRIX_SIZE * row, NODE_MATRIX_SIZE * col, - NULL); + xbt_matrix_new_sub(B, NODE_MATRIX_SIZE, NODE_MATRIX_SIZE, NODE_MATRIX_SIZE * row, NODE_MATRIX_SIZE * col, NULL); if (++col >= GRID_SIZE){ col = 0; @@ -331,22 +306,22 @@ static void create_jobs(xbt_matrix_t A, xbt_matrix_t B, node_job_t *jobs) } } -static void receive_results(result_t *results){ - int node; +static void receive_results(result_t *results) { msg_comm_t comms[GRID_NUM_NODES-1] = {0}; - m_task_t tasks[GRID_NUM_NODES-1] = {0}; + msg_task_t tasks[GRID_NUM_NODES-1] = {0}; XBT_VERB("Receive Results."); /* Get the result from the nodes in the GRID */ - for (node = 1; node < GRID_NUM_NODES; node++){ + for (int node = 1; node < GRID_NUM_NODES; node++) comms[node-1] = MSG_task_irecv(&tasks[node-1], "0"); - } MSG_comm_waitall(comms, GRID_NUM_NODES - 1, -1); + for (int node = 1; node < GRID_NUM_NODES; node++) + MSG_comm_destroy(comms[node - 1]); /* Reconstruct the result matrix */ - for (node = 1; node < GRID_NUM_NODES; node++){ + for (int node = 1; node < GRID_NUM_NODES; node++){ results[node] = (result_t)MSG_task_get_data(tasks[node-1]); MSG_task_destroy(tasks[node-1]); }