MPI: все для всех транслируются в одномерном массиве - PullRequest
0 голосов
/ 11 мая 2011

У меня есть количество процессоров и один массив, и каждый процессор выполняет свою работу, одномерный массив, например:

  • dens_process_array для процесса 1: | Process1 | 0000000000000 |
  • dens_process_array для процесса 2: | 000000 | Process2 | 000000 |

каждый процесс заполняет свой интервал, тогда я хочу, чтобы у всех процессоров были другие результаты в одном массиве.

  • Процесс 1 => dens_process_array | process1 | process2 | ..... | processN |
  • Процесс 2 ... Процесс N

(как и all2all bcast) Поэтому каждый процесс вызывает эту функцию:

void doCommunication(int id, int numprocs, int start_point, int end_point) {
    int size_of_length = end_point - start_point + 1;
    MPI_Scatter(dense_process_array+start_point, size_of_length, MPI_DOUBLE, dense _process_array +start_point, size_of_length, MPI_DOUBLE, id, MPI_COMM_WORLD;                                                                                                                                                                                                                                                                             
}

Но, в конце концов, когда я посмотрел свой массив из какого-либо процесса, я увидел, что он не может получить результаты других процессов, можете ли вы что-нибудь предложить?

нет: я новичок в MPI, и в основном я хочу, чтобы все2 всех bcast.

1 Ответ

1 голос
/ 11 мая 2011

Я полагаю, вы ищете MPI_Allgather :

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

void printdata(int size, int rank, int n, int *data) {
    printf("Rank %d\n",rank);
    for (int j=0; j<size*n; j++)
        printf("%d ",data[j]);
    printf("\n");
}

int main(int argc, char **argv) {
    const int n=3;
    int ierr, rank, size;
    int *datain, *dataout;

    ierr = MPI_Init(&argc, &argv);
    ierr|= MPI_Comm_size(MPI_COMM_WORLD,&size);
    ierr|= MPI_Comm_rank(MPI_COMM_WORLD,&rank);

    datain = (int *)malloc(n*size*sizeof(int));
    dataout = (int *)malloc(n*size*sizeof(int));
    for (int i=0; i<n*size; i++)
        datain[i]=9;
    for (int i=0; i<n; i++)
        datain[rank*n+i]=rank;

    if (rank == 0) printf("Before:\n");
    printdata(size, rank, n, datain);

    MPI_Allgather(&(datain[rank*n]), n, MPI_INT, dataout, n, MPI_INT, MPI_COMM_WORLD);

    if (rank == 0) printf("After:\n");
    printdata(size, rank, n, dataout);

    free(datain);
    free(dataout);
    MPI_Finalize();
    return 0;
}

Бег дает

$ mpirun -np 3 ./allgather
Before:
Rank 0
0 0 0 9 9 9 9 9 9 
Rank 1
9 9 9 1 1 1 9 9 9 
Rank 2
9 9 9 9 9 9 2 2 2 
After:
Rank 0
0 0 0 1 1 1 2 2 2 
Rank 1
0 0 0 1 1 1 2 2 2 
Rank 2
0 0 0 1 1 1 2 2 2 
...