MPI - Ошибка отправки случайного int в корневой процесс - PullRequest
0 голосов
/ 22 октября 2018

Вот мой кусок кода:

int world_size;
MPI_Comm_size(MPI_COMM_WORLD , &world_size);

int world_rank;
MPI_Comm_rank(MPI_COMM_WORLD , &world_rank);

int *rbuf , arr[world_size];
if (world_rank == 0)
{
    rbuf = (int *) malloc(world_size * 1 * sizeof(int));
}
else
{
    rbuf[0] = rand() % 100;
    MPI_Send(rbuf , 1 , MPI_INT , 0 , 0 , MPI_COMM_WORLD);
}
if (world_rank == 0)
{
    MPI_Gather(arr , world_size , MPI_INT , rbuf , 1 , MPI_INT , 0 , MPI_COMM_WORLD);
    for (int i = 0; i < world_size; ++i)
    {
        printf("%d " , arr[i]);
    }
    printf("\n");
}

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

Когда я пытаюсь запустить этот код, я получаю сообщение об ошибке:

Fatal error in PMPI_Gather: Message truncated, error stack:
PMPI_Gather(896)......: MPI_Gather(sbuf=0x7ffc3b23c180, scount=10, MPI_INT, rbuf=0x564a753dc790, rcount=1, MPI_INT, root=0, MPI_COMM_WORLD) failed
MPIR_Gather_impl(718).: 
MPIR_Gather(678)......: 
MPIR_Gather_intra(184): 
MPIR_Localcopy(74)....: Message truncated; 40 bytes received but buffer size is 4

(PS. Я запускаю эту программу, используяmpirun -n 10 ./helloworld)

1 Ответ

0 голосов
/ 22 октября 2018

MPI_Gather отправлять сообщения из всех рангов в root и получать себя в этом не нужно MPI_Send.

Я изменил ваш пример:

#include<stdio.h>
#include<mpi.h>
#include<stdlib.h>
#include<time.h>
int main(int argc, char **argv){

  MPI_Init(&argc, &argv);
  int world_size;
  MPI_Comm_size(MPI_COMM_WORLD , &world_size);
  int world_rank;
  MPI_Comm_rank(MPI_COMM_WORLD , &world_rank);

  srand(time(NULL)+world_rank);
  int *rbuf,*sender;
  if (world_rank == 0)
  {
    rbuf = (int *) malloc(world_size * 1 * sizeof(int));
  }
  sender = (int *) malloc( 1 * sizeof(int));
  sender[0] = rand() % 100;

  MPI_Gather(sender , 1 , MPI_INT , rbuf , 1 , MPI_INT , 0 , MPI_COMM_WORLD);
  if (world_rank == 0)
  {
    for (int i = 0; i < world_size; ++i)
    {
        printf("%d " , rbuf[i]);
    }
    printf("\n");
  }
  MPI_Finalize();
}
...