2017-01-27 5 views
0

Я довольно новичок в параллельной обработке. У меня есть пример вычисления и хранения элементов 2D-массива последовательным образом. Я хотел преобразовать это в параллельную программу, используя MPI.Итерирование 2D-массива с использованием параллельной обработки MPI

Ниже приведен код для последовательной программы.

#include <stdio.h> 
int x,y,xMax=10,yMax=10; 
int main() 
{ 
    int arr[yMax][xMax]; 
    for(y =0; y<yMax;x++) 
    { 
     for (x=0;x<xMax;x++) 
     { 
     arr[y][x]=x+y; 
     printf("%d",arr[y][x]); 
     } 
     printf("\n"); 
    } 
} 

Я попытался преобразовать это в эквивалентную программу MPI с помощью распараллеливания внешнего цикл следующим образом: Здесь я хочу каждый процесс для вычисления значений для каждой строки массива и передавать выходной массив корневого процесса, который на end будет собирать все массивы и объединять их в один 2D-массив.

#include <stdio.h> 
#include <mpi.h> 
int x,y,xMax=10,yMax=10,size,rank; 
int main() 
{ 
    int arr[xMax]; 
    int arrall[yMax][xMax]; 
    MPI_Init(NULL,NULL); 
    MPI_Comm_size(MPI_COMM_WORLD, &size); 
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
    for(y =0+rank; y<yMax;y=y+size) 
    { 
     for (x=0;y<xMax;x++) 
     { 
     arr[y][x]=x+y; 

     } 
     MPI_Send(arr,xMax,MPI_INT,0,0,MPI_COMM_WORLD); 
    } 
    if(rank==0) 
    { 
    MPI_Gather(arr,xMax,MPI_INT,&arrall,xMax*yMax,MPI_INT,0,MPI_COMM_WORLD); 
    } 
    MPI_Finalize(); 
} 

Но когда я скомпилирую программу и жду долгое время, но она по-прежнему не дает никакого результата. и он не показывает ошибок. Я пробую это довольно долго и искал любое решение, но не смог его найти. Любая помощь будет высоко ценится. Спасибо

ответ

0

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

Вся связь осуществляется с помощью одного вызова к MPI_Gather для всех процессов:

MPI_Gather(arr,xMax,MPI_INT,arrall,xMax,MPI_INT,0,MPI_COMM_WORLD); 

Обратите внимание, что recvcount является xMax, поскольку она определяет количество элементов в каждом получать.

еще несколько замечаний:

  • Вы должны убедиться, что size == yMax
  • Это работает только потому, что 2D массивы укладываются построчно смежно в памяти. Это не работает с указателями-2D-массивами.
  • В реальной программе MPI вы хотите избежать сбора всех рабочих данных на одном уровне, поскольку это представляет собой предел для масштабируемости. Вместо этого вы должны все распределить.

Edit: Один конкретный путь для более одной строки за ранг:

int rows_per_rank = yMax/size; 
assert(rows_per_rank * size == yMax); 
MPI_Gather(arr,xMax * rows_per_rank,MPI_INT,arrall,xMax * rows_per_rank,MPI_INT,0,MPI_COMM_WORLD); 
+0

спасибо! каков будет размер выпуска? будет ли это 2D-массив? – Max

+0

'arrall' будет заполнен элементами' size * xMax'. «Выход» будет соответствовать расположению данных 2D-массива. – Zulan

+0

«Вы должны убедиться, что размер == yMax» вы можете помочь мне преодолеть эту проблему? Я не могу дать задачу 1000 процессам, если yMax = 1000. Спасибо – Max

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