Доступные ядра и количество процессов в openMPI

Я попробовал следующий код «hello world», сначала в своей системе (8 ядер), затем на сервере (160 ядер):

int main(int argc, char *argv[]) {
  int numprocs, rank, namelen;
  char processor_name[MPI_MAX_PROCESSOR_NAME]; 
  double t;
  t=MPI_Wtime();
  MPI_Init(&argc, &argv);
  MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
  MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  MPI_Get_processor_name(processor_name, &namelen);

  //printf("Process %d on %s out of %d\n", rank, processor_name, numprocs);
  printf("%f---%d---%s\n",MPI_Wtime()-t,rank,processor_name);
  sleep(.5);//to make sure, each process needs a significant amount of time to finish
  MPI_Finalize();
}

Я запускаю программу со 160 процессами, используя mpirun -np 160 ./hello. Я ожидал, что работа сервера будет более эффективной, поскольку в начальной точке для каждого процесса доступно одно ядро, но результат оказался противоположным.

8 cores : 2.25 sec
160 cores : 5.65 sec

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


person Ankur Gautam    schedule 09.07.2013    source источник
comment
Я предполагаю, что это не из-за задержки SSH или чего-то в этом роде.   -  person Ankur Gautam    schedule 10.07.2013
comment
Если вы не задаете вопрос, который не зависит от конкретного языка, не отмечайте одновременно C и C++.   -  person Wug    schedule 10.07.2013
comment
@Wug Я позабочусь об этом в следующий раз. Я думал, что это зависит от языка из-за реализации openMPI.   -  person Ankur Gautam    schedule 10.07.2013
comment
Как вы его скомпилировали?   -  person Wug    schedule 10.07.2013
comment
используя mpic++ , файл представляет собой файл cpp.   -  person Ankur Gautam    schedule 10.07.2013
comment
Из документации о параллельном программировании, которую я читал, вы получаете ускорение только до определенной точки, а затем вы можете фактически замедлиться из-за всех накладных расходов.   -  person    schedule 10.07.2013
comment
@ Matt2234, но разве это не должно зависеть от доступного процессора/ядра? у меня тормозит только из-за лишнего времени ожидания, что должно было случиться в случае с 8 ядрами.   -  person Ankur Gautam    schedule 10.07.2013
comment
Попробуйте это еще раз с какой-нибудь сложной задачей, и вы, вероятно, получите другие результаты, вы думаете, что 8 будет медленнее, но со всеми накладными расходами от 160 ядер, перемещающихся между памятью, вы замедляетесь.   -  person    schedule 10.07.2013
comment
какой тип памяти передается? это не модель с общей памятью. Так о каких накладных расходах вы говорите?   -  person Ankur Gautam    schedule 10.07.2013
comment
Вызов MPI_Wtime() перед MPI_Init() приводит к нестандартной программе MPI. Стандарт позволяет реализациям предоставлять синхронизированные глобальные часы, и для них требуется, чтобы сначала вызывался MPI_Init(). Запомните это замечание.   -  person Hristo Iliev    schedule 10.07.2013
comment
Это было сложно. Я изменил позицию MPI_Wtime(). И в обоих случаях была разница во времени обработки. В целом это быстро на сервере, но есть лишь небольшая разница. спасибо @HristoIliev за помощь мне время от времени. Не могли бы вы также объяснить процесс сопоставления ядра/сокета по умолчанию в openMPI? Я имею в виду, выделяется ли ядро ​​для каждого процесса или это происходит в сложной картине? также я хочу знать, возможно ли выполнить 160 процессов с спящим режимом не менее 0,5 с с 8 процессорами почти за 1 секунду? Нет ли очереди ожидания или чего-то в этом роде.   -  person Ankur Gautam    schedule 10.07.2013
comment
и новые тайминги 8 ядер: 1.0023000 160 ядер: 1.0000023   -  person Ankur Gautam    schedule 10.07.2013
comment
Сопоставление по умолчанию вообще не сопоставлено. Ранги распределяются один за другим до тех пор, пока все слоты на узле не будут заполнены, затем он переходит к следующему компьютеру в файле хоста. Когда последний узел заполнен, он начинает переподписывать узлы, начиная с первого. Обратите внимание, что MPI_Init() занимает все больше времени с увеличением количества процессов, и это поведение не ограничивается только Open MPI.   -  person Hristo Iliev    schedule 10.07.2013
comment
Спящий режим не использует ресурсы ЦП, и даже планировщик задач ОС не обращает внимания на процесс, если он не разбужен сигналом или в конце интервала сна. У вас могут быть тысячи процессов, спящих одновременно и почти одинаковое количество времени.   -  person Hristo Iliev    schedule 10.07.2013
comment
Большое спасибо ! Вы экономите мое время. :)   -  person Ankur Gautam    schedule 10.07.2013


Ответы (1)


На самом деле вы не измеряете производительность чего-либо, что выиграет от масштабирования. Единственное, что вы измеряете, это время запуска. В этом случае вы ожидаете, что запуск большего количества процессов займет больше времени. Вы должны запускать процессы, подключать сетевые подключения и т. д. Кроме того, и ваш ноутбук, и сервер имеют по одному процессу на ядро, поэтому он не меняется от одного к другому.

Лучшее измерение проверки того, является ли большее количество ядер более эффективным, — это выполнить какой-то пример расчета и измерить ускорение от большего количества ядер. Вы можете попробовать традиционный расчет PI.

person Wesley Bland    schedule 09.07.2013
comment
Лучшее измерение проверки того, является ли наличие большего количества ядер более эффективным, - это выполнить какой-то пример расчета: вам не кажется, что вызов сна - это то же самое, что и вычисление для данного процесса? Я специально предоставил его только для того, чтобы учесть еще кое-что, помимо времени запуска. - person Ankur Gautam; 10.07.2013
comment
Спящий вызов — это не вычисление. Это просто заставляет процессы ничего не делать. Вся причина, по которой вы используете параллельную обработку (будь то MPI, потоки или что-то еще), заключается в том, что вы хотите взять большую задачу, которую вы либо не смогли бы решить на своей локальной машине, либо ее решение заняло бы слишком много времени, и разделить проблема так, чтобы она могла быть решена одновременно многими процессами. В вашем приложении нет никаких вычислений. Вы измеряете только время, необходимое для запуска всех процессов. - person Wesley Bland; 10.07.2013
comment
Моя точка зрения такова: это совершенно точно, каждому процессу для выполнения требуется хотя бы одно ядро. Как вы думаете, как время обработки на моем компьютере (8 ядер) может составлять около 2 секунд? Если имеется 160 процессов, и каждому процессу требуется в среднем 0,5 секунды, прежде чем он завершится, должно быть время ожидания во время всей обработки. - person Ankur Gautam; 10.07.2013
comment
Я не знаю, что еще я могу сказать. Очевидно, вы не понимаете, что я пытаюсь объяснить. То, что вы рассчитываете, не является временем обработки. Вы не делаете никакой обработки. Вы просто запускаете приложение и снова его останавливаете. - person Wesley Bland; 10.07.2013