увеличение количества процессоров в mpi увеличивает время обработки?

Я новичок в параллельных вычислениях, поэтому решил начать с компиляции hello world с помощью Mpich2. Вот код:

/* helloworld.c */

#include <stdio.h>

/* You MUST include this for the MPI_* functions */
#include "mpi.h"

int main(int argc, char **argv) {
   int rank;
   char host[150];
   int namelen;

   /* Initialize MPI. This handles mpich-specific command line arguments */
   MPI_Init(&argc, &argv);

   /* Get my rank. My rank number gets stored in the 'rank' variable */
   MPI_Comm_rank(MPI_COMM_WORLD, &rank);

   /* Look up what computer I am running on. Store it in 'host' */
   MPI_Get_processor_name(host,&namelen);

   printf("Hello world (Rank: %d / Host: %s)\n", rank, host);
   fflush(stdout);

   /* Finalize: Close connections to the other children, clean up memory
    * the MPI library has allocated, etc */
   MPI_Finalize();
   return 0;
}

Я компилирую и запускаю его так:

mpicc helloworld.c -o myhello 
mpirun -nc 2 ./myhello

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


person Ress    schedule 11.11.2014    source источник
comment
Это не количество процессоров, это количество процессов, и в вашей системе может быть запущено гораздо больше процессов, чем у вас есть процессоров (даже сейчас в вашей системе, вероятно, запущено около 100 процессов). Не могли бы вы поделиться своим кодом программы hello world? Это может помочь с ответом на вопрос, но я предполагаю, что MPI должен создавать процессы и синхронизировать их, что увеличивает время работы.   -  person bialpio    schedule 11.11.2014
comment
если вы действительно новичок и серьезно относитесь к этому, я предлагаю прочитать книгу. В вашем случае, проще говоря, n процессов, выполняющих одно и то же, займет столько же времени, сколько 1 процесс, выполняющий это действие. Печатая что-то в каждом процессе, вы не распределяете никакой работы и фактически конкурируете за ресурсы, такие как, например. ввод/вывод.   -  person steabert    schedule 11.11.2014
comment
Больше времени уходит на запуск большего количества процессов и их синхронизацию в конце. Если вы каким-то образом не разделите работу между ними — чего вы не делаете — общее время будет только увеличиваться. Вот и все.   -  person Hristo Iliev    schedule 11.11.2014


Ответы (1)


Во-первых, параллельная обработка в теории должна делать так, как вы говорите:

  • Процесс, выполняемый одним, должен быть быстрее, если выполняется вдвоем.

Об этом приятно думать в теории, но на практике это совсем другая история.

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

Я бы посоветовал сделать что-то, что действительно может показать полезность параллельного процесса, например, разбить массив на разные сегменты и вычислить каждый сегмент с помощью другого процессора (т.е. должен быть огромный массив) или одновременно читать разные текстовые файлы. время и немного над ними поработать.

И последнее замечание: вам действительно следует изучить закон Амдала, который объясняет, насколько система может ускорить с параллельной обработкой.

person Jay    schedule 11.11.2014