+static void create_jobs(xbt_matrix_t A, xbt_matrix_t B, node_job_t *jobs)
+{
+ int node, j, k, row = 0, col = 0;
+
+ for (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;
+ jobs[node]->col = col;
+
+ /* 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++) {
+ 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++) {
+ if (node != (GRID_SIZE * j) + col) {
+ jobs[node]->nodes_in_col[k] = (GRID_SIZE * j) + col;
+ k++;
+ }
+ }
+
+ /* 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);
+ jobs[node]->B =
+ 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;
+ row++;
+ }
+ }
+}
+
+static void receive_results(result_t *results){
+ int node;
+ msg_comm_t comms[GRID_NUM_NODES-1] = {0};
+ msg_task_t tasks[GRID_NUM_NODES-1] = {0};