X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/272ccad1b68b6d9c17069f3c934886925bb15b5d..9fa16e4064e1789bb1c56e0862ec6e03194a959c:/examples/msg/pmm/msg_pmm.c diff --git a/examples/msg/pmm/msg_pmm.c b/examples/msg/pmm/msg_pmm.c index 243657dde1..6a0e8a9aac 100644 --- a/examples/msg/pmm/msg_pmm.c +++ b/examples/msg/pmm/msg_pmm.c @@ -1,11 +1,12 @@ /* 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 "simgrid/msg.h" #include "xbt/matrix.h" #include "xbt/log.h" @@ -28,7 +29,7 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(msg_pmm, /* 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*/ +#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 +48,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 { @@ -63,14 +64,13 @@ static node_job_t wait_job(int selfid); static void broadcast_matrix(xbt_matrix_t M, int num_nodes, int *nodes); static void get_sub_matrix(xbt_matrix_t *sM, int selfid); static void receive_results(result_t *results); -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"); @@ -96,6 +96,7 @@ int node(int argc, char **argv) broadcast_jobs(jobs + 1); }else{ + A = B = C = NULL; /* Avoid warning at compilation */ myjob = wait_job(myid); } @@ -158,9 +159,13 @@ 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."); @@ -170,10 +175,11 @@ int node(int argc, char **argv) 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); @@ -187,7 +193,7 @@ static void broadcast_jobs(node_job_t *jobs) { int node; char node_mbox[MAILBOX_NAME_SIZE]; - m_task_t task; + msg_task_t task; msg_comm_t comms[GRID_NUM_NODES - 1] = {0}; XBT_VERB("Broadcast Jobs"); @@ -198,15 +204,20 @@ static void broadcast_jobs(node_job_t *jobs) } MSG_comm_waitall(comms, GRID_NUM_NODES-1, -1); + for (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; + msg_error_t err; snprintf(self_mbox, MAILBOX_NAME_SIZE - 1, "%d", selfid); - MSG_task_receive(&task, self_mbox); + err = MSG_task_receive(&task, self_mbox); + xbt_assert(err == MSG_OK, "Error while receiving from %s (%d)", + self_mbox, (int)err); job = (node_job_t)MSG_task_get_data(task); MSG_task_destroy(task); XBT_VERB("Got Job (%d,%d)", job->row, job->col); @@ -218,14 +229,14 @@ 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; + msg_task_t task; xbt_matrix_t sM; for(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); - MSG_task_dsend(task, node_mbox, task_cleanup); + MSG_task_dsend(task, node_mbox, NULL); XBT_DEBUG("sub-matrix sent to %s", node_mbox); } @@ -233,34 +244,30 @@ static void broadcast_matrix(xbt_matrix_t M, int num_nodes, int *nodes) 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]; + msg_error_t err; XBT_VERB("Get sub-matrix"); snprintf(node_mbox, MAILBOX_NAME_SIZE - 1, "%d", selfid); - MSG_task_receive(&task, node_mbox); + err = MSG_task_receive(&task, node_mbox); + if (err != MSG_OK) + xbt_die("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; - 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(); + xbt_os_cputimer_t timer = xbt_os_timer_new(); #endif - MSG_global_init(&argc, argv); + MSG_init(&argc, argv); char **options = &argv[1]; const char* platform_file = options[0]; @@ -272,20 +279,15 @@ int main(int argc, char *argv[]) MSG_launch_application(application_file); #ifdef BENCH_THIS_CODE - xbt_os_timer_start(timer); + xbt_os_cputimer_start(timer); #endif - MSG_error_t res = MSG_main(); + msg_error_t res = MSG_main(); #ifdef BENCH_THIS_CODE - xbt_os_timer_stop(timer); + xbt_os_cputimer_stop(timer); #endif XBT_CRITICAL("Simulated time: %g", MSG_get_clock()); - MSG_clean(); - - 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) @@ -334,7 +336,7 @@ 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; 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."); @@ -344,6 +346,8 @@ static void receive_results(result_t *results){ } MSG_comm_waitall(comms, GRID_NUM_NODES - 1, -1); + for (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++){