Синхронизация массива MPI - PullRequest
       10

Синхронизация массива MPI

0 голосов
/ 03 октября 2009

Я изучаю MPI, поэтому я могу написать простую нечетную четную сортировку для 2 процессоров. Первый процессор сортирует четные элементы массива и второй нечетные элементы массива. Я использую глобальный массив для 2 процессоров, поэтому мне нужна синхронизация (что-то вроде семафора или переменной блокировки), потому что я получаю плохие результаты. Как эта проблема решается в MPI? Мой код:

#include "mpi.h"
#include <stdio.h>

int main(int argc, char *argv[])
{
   int rank, size ; 
   int n = 6 ; 
   int array[6] = { 5, 6, 1, 2, 4, 10} ;
   MPI_Init(&argc, &argv) ; 
   MPI_Comm_rank( MPI_COMM_WORLD, &rank) ; 
   MPI_Comm_size( MPI_COMM_WORLD, &size)  ;
   if (size == 2)
   {  
     int sorted1;
     int sorted2;  
     if (rank == 0)
     {
        sorted1 = 0 ;
   while (!sorted1) 
        {
  sorted1 = 1 ; 
          int x; 
   for (x=1; x < n; x += 2)
   {
             if (array[x] > array[x+1])
      {
                int tmp = array[x]  ;
   array[x] = array[x+1] ;
  array[x+1] = tmp ;
  sorted1 = 0 ;  
             }
          } 
        }
     }
     if (rank == 1)
     {
        sorted2 = 0 ;
   while (!sorted2) 
        {
  sorted2 = 1 ; 
          int x; 
   for (x=0; x < n-1; x += 2)
   {
             if (array[x] > array[x+1])
      {
                int tmp = array[x]  ;
   array[x] = array[x+1] ;
  array[x+1] = tmp ;
  sorted2 = 0 ;  
             }
          } 
        }

     } 
   } 
   else if (rank == 0) printf("Only 2 processors supported!\n") ; 
     int i=0 ; // bad output printed two times..
     for (i=0; i < n; i++)
     {
        printf("%d ", array[i])  ;
     }
     printf("\n") ; 

   MPI_Finalize() ; 
   return 0 ; 
}

1 Ответ

1 голос
/ 21 октября 2009

Каждая из ваших двух задач MPI работает с другой копией массива. Вам необходимо явно объединить два массива, используя что-то вроде MPI_Send () и MPI_Recv () или одну из более сложных функций MPI.

MPI - это модель программирования с распределенной памятью, а не разделяемая память, такая как OpenMP или потоки.

...