2013-09-22 2 views
3

Я собирался изучить параллельное программирование с помощью MPI. И у меня есть некоторые ошибкиMPI Broadcasting 2d array

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


int main(int argc, char** argv) 
{ 
    int procNum, procRank; 
    int m,n; 
    int sumProc = 0, sumAll = 0; 
    int** arr; 
    MPI_Status status; 

    MPI_Init (&argc, &argv); 

    MPI_Comm_size (MPI_COMM_WORLD, &procNum); 
    MPI_Comm_rank (MPI_COMM_WORLD, &procRank); 

    if (procRank == 0) 
    { 
     printf("Type the array size \n"); 
     scanf("%i %i", &m, &n); 
    } 
    MPI_Bcast(&m, 1, MPI_INT, 0, MPI_COMM_WORLD); 
    MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD); 

    arr = new int*[m]; 
    for (int i = 0; i < m; i++) 
     arr[i] = new int[n]; 

    if (procRank == 0) 
    { 
     for (int i = 0; i < m; i++) 
     { 
      for (int j = 0; j < n; j++) 
      { 
        arr[i][j] = rand() % 30; 
        printf("%i ", arr[i][j]); 
      } 
      printf("\n"); 
     } 
    } 

    MPI_Bcast(&arr[0][0], m*n, MPI_INT, 0, MPI_COMM_WORLD); 

    for (int i = procRank; i < n; i += procNum) 
     for (int j = 0; j < m; j++) 
      sumProc += arr[j][i]; 

    MPI_Reduce(&sumProc,&sumAll,1,MPI_INT,MPI_SUM,0,MPI_COMM_WORLD); 

    if (procRank == 0) 
    { 
     printf("sumAll = %i", sumAll); 
    } 

    delete *arr; 

    MPI_Finalize(); 
    return 0; 
} 

Я пытаюсь передать 2d массив другим процессам, но когда я проверить это я получаю неправильный массив. Что-то вроде этого:

Original array 
11 17 4 
10 29 4 
18 18 22 

Array which camed 
11 17 4 
26 0 0 
28 0 0 

Что проблема это? Возможно, вопрос находится в MPI_Bcast

P.S. Я добавил

for (int i = 0; i < m; i++) 
    MPI_Bcast(arr[i], n, MPI_INT, 0, MPI_COMM_WORLD); 

вместо

MPI_Bcast(&arr[0][0], m*n, MPI_INT, 0, MPI_COMM_WORLD); 

Это решается мой вопрос

+3

Мне кажется, что в вашей неудачной версии вы (ошибочно) предположили, что массив смежен в памяти. –

ответ

1

Здесь

arr = new int*[m]; 
for (int i = 0; i < m; i++) 
    arr[i] = new int[n]; 

создания 2D массива сначала создать массив указателей, а затем создать регулярные внутренние массивы для каждого из них. Используя этот метод, все ваши массивы a[i] имеют размер n, но не гарантируется, что они смежны в памяти.

Позже, однако, с

MPI_Bcast(&arr[0][0], m*n, MPI_INT, 0, MPI_COMM_WORLD); 

вы предполагаете, что все массивы являются смежными в памяти. Поскольку это не так, вы получаете разные значения.