Кластер работает только с 7 или менее задачами, использующими MPI - PullRequest
0 голосов
/ 30 апреля 2019

Я наконец-то заставил свою программу работать в кластере с использованием MPI, но как только я масштабировал ее после 7 задач, я получаю ошибку сегментации. Я вернулся к супер базовой программе, приведенной ниже, и все еще получаю ошибку сегментации после 7 ядер. Для отладки я выделил для себя 8 ядер в кластере, чтобы непосредственно работать над ними, а не отправлять работу с грязью. Я получаю проблему, используя компилятор Intel и GCC. Я думал, что он сломается на 8 процессорах, но это 7, и я нахожу это немного странным. Но опять же, я нахожу все это странным. Любая идея о том, почему код выходит за рамки определенного количества выделенных ядер (я мог бы добавить к тому же узлу).

На кластере я использую это: $ salloc -n 8

$ enable_lmod

$ загрузка модуля icc / 19 impi / 19 libstdcxx / 4

$ mpiicpc -std = c ++ 11 -o MPItest test.cpp

$ mpiexec.hydra ./MPItest test


#include "mpi.h"

#include <stdio.h>

int main(int argc, char** argv) 
{
int numtasks, rank, dest, source, rc, count, tag=1;  
double inmsg, outmsg=20.0;
MPI_Status Stat;

MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD, &numtasks);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);

if (rank == 0) 
{
  printf("Number of processors: %d \n",numtasks);
  for (int i=1; i<numtasks;i++)
  {
    dest = i;
    outmsg+=outmsg;
    rc = MPI_Send(&outmsg, 1, MPI_DOUBLE, dest, tag, MPI_COMM_WORLD);
  }

  MPI_Barrier(MPI_COMM_WORLD);

  for (int i=1; i<numtasks;i++)
  {
    source = i;
    rc = MPI_Recv(&inmsg, 1, MPI_DOUBLE, source, tag, MPI_COMM_WORLD, &Stat);

    rc = MPI_Get_count(&Stat, MPI_DOUBLE, &count);
    printf("Task %d: Received %d double(s), %f, from task %d with tag %d \n",
       rank, count,inmsg, Stat.MPI_SOURCE, Stat.MPI_TAG);
  }  
} 

else
{
  dest = 0;
  source = 0;
  rc = MPI_Recv(&inmsg, 1, MPI_DOUBLE, source, tag, MPI_COMM_WORLD, &Stat);

  rc = MPI_Get_count(&Stat, MPI_DOUBLE, &count);
  printf("Task %d: Received %d double(s), %f, from task %d with tag %d \n",
        rank, count,inmsg, Stat.MPI_SOURCE, Stat.MPI_TAG);

  rc = MPI_Send(&inmsg, 1, MPI_DOUBLE, dest, tag, MPI_COMM_WORLD);
  MPI_Barrier(MPI_COMM_WORLD);
}

MPI_Finalize();
return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...