2015-01-15 3 views
2

У меня возникли трудности с выполнением функции MPI_Bcast. Я хочу передать двумерный массив всем процессам. Похоже, что широковещательное сообщение не работает, потому что сообщение fisrt, которое ведомые процессы читают, является тем, которое делает их функциями, - когда DIETAG использует функцию te, это выход.Как передать массив измерений во все процессы, используя широковещательную рассылку?

Может ли кто-нибудь сказать, что является правильным способом передать два массива измерений в slace-процессы, используя функцию широковещания?

#include <stdio.h> 
#include <iostream> 
#include <string> 
#include <time.h> 
#include <mpi.h> 

using namespace std; 

/* Global constants */ 

    #define MASTER 0 
    #define WORKTAG 1 
    #define DIETAG 2 
    #define MATRIX_SIZE 100 

/* Local functions */ 

    static void master(void); 
    static void slave(void); 
    static void initialize_matrix(int (*matrix)[MATRIX_SIZE]); 

/* Function executed when program is started */ 

    int main(int argc, char **argv) 
    { 
     // Declaring/Initizing local variables 
     int current_rank; 

     // Initialize MPI 
     MPI_Init(&argc, &argv); 

     // Finding out current procces identity in the default communicator 
     MPI_Comm_rank(MPI_COMM_WORLD, &current_rank); 

     if (current_rank == MASTER) { 
      master(); 
     } else { 
      slave(); 
     } 

     // Shut down MPI 
     MPI_Finalize(); 

     return 0; 
    } 

/* Function executed by "master" process */ 

    static void master(void) 
    { 
     // Declaring variables 
     int matrix_one[MATRIX_SIZE][MATRIX_SIZE]; 
     int processes_count, current_process_rank; 

     // Initializing variables 
     initialize_matrix(matrix_one); 
     MPI_Comm_size(MPI_COMM_WORLD, &processes_count); 
     MPI_Comm_rank(MPI_COMM_WORLD, &current_process_rank); 

     // this is currently not working 
     MPI_Bcast(&matrix_one, MATRIX_SIZE * MATRIX_SIZE, MPI_INT, current_process_rank, MPI_COMM_WORLD); 

     // Tell all the slaves to exit by sending an empty message with the DIETAG 
     for (current_process_rank = 1; current_process_rank < processes_count; current_process_rank++) { 
      MPI_Send(0, 0, MPI_INT, current_process_rank, DIETAG, MPI_COMM_WORLD); 
     } 

    } 

/* Function executed by "slave" processes_count */ 

    static void slave(void) { 

     MPI_Status status; 
     int current_process_rank; 
     int matrix_one[MATRIX_SIZE][MATRIX_SIZE]; 

     MPI_Comm_rank(MPI_COMM_WORLD, &current_process_rank); 

     //received 

     while(1) { 

      MPI_Recv(&matrix_one, MATRIX_SIZE * MATRIX_SIZE, MPI_INT, 0, MPI_ANY_TAG, MPI_COMM_WORLD, &status); 

      // Check the tag of the received message 
      if (status.MPI_TAG == DIETAG) { 
       return; 
      } 

      cout<<"value"<<matrix_one[0][0]; 
     } 
    } 

/* Function for populating matrix with random numbers */ 

    static void initialize_matrix(int (*matrix)[MATRIX_SIZE]) 
    { 
     int row, col; 
     for (row = 0; row < MATRIX_SIZE; row++) 
     { 
      for (col = 0; col < MATRIX_SIZE; col++) 
      { 
       matrix[row][col] = rand(); 
      } 
     } 
    } 
+5

* Все * задачи, которые участвуют в передаче должны вызвать MPI_Bcast; в частности, не используется MPI_Recv для возврата результатов Bcast. См. Например, [этот вопрос] (http://stackoverflow.com/questions/7864075/using-mpi-bcast-for-mpi-communication). –

ответ

2

Это распространенная ошибка для людей при запуске в MPI. Коллективные операции должны быть вызваны всеми процессами в коммуникаторе MPI. Они соответствуют только другим вызовам того же типа.

Не думайте о MPI_Bcast как о едином процессе, отправляющем кучу сообщений в кучу других процессов. Вместо этого, подумайте об этом как о связке процессов, работающих вместе, так что, когда закончится MPI_Bcast, все процессы имеют одинаковые данные. Это требует, чтобы все они вызывали MPI_Bcast вместо одного процесса вещания, а все остальные вызывали MPI_Send.

Там хороший учебник о том, как использовать простые коллективные функции здесь: http://mpitutorial.com/mpi-broadcast-and-collective-communication/

+0

, и это должно быть 'MPI_Bcast (& (matrix_one [0] [0]), MATRIX_SIZE * MATRIX_SIZE, MPI_INT, current_process_rank, MPI_COMM_WORLD);', а не 'MPI_Bcast (& matrix_one, MATRIX_SIZE * MATRIX_SIZE, MPI_INT, current_process_rank, MPI_COMM_WORLD);' – francis

Смежные вопросы