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

Я новичок в параллельных вычислениях, поэтому я решил начать с привет компиляции мира с 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 ядер, но я могу установить столько процессоров в коде, сколько захочу, я ожидаю некоторую ошибку, если превысию количество реальных процессоров.

1 ответ

Решение

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

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

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

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

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

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

Другие вопросы по тегам