"есть ли какие-нибудь законы / теоремы, которые помогут мне определить оптимальное количество узлов, на которых я должен запустить эту программу?"
Нет таких общих законов, потому что каждая проблема имеет немного отличающиеся характеристики.
Вы можете создать математическую модель производительности вашей задачи на различном количестве узлов, зная, сколько вычислительной работы необходимо выполнить, сколько коммуникаций необходимо выполнить и сколько времени занимает каждый. (Время связи можно оценить по количеству коммутаций и типичным значениям задержки / пропускной способности для типа межсоединения ваших узлов). Это может помочь вам сделать правильный выбор.
Эти модели могут быть полезны для понимания того, что происходит, но для того, чтобы действительно определить правильное количество узлов, на которых будет выполняться код для некоторого заданного размера проблемы, на самом деле нет замены для запуска теста масштабирования - запуска проблемы на различное количество узлов и реально видя, как это работает. Номера, которые вы хотите увидеть:
- Время до завершения как функция числа процессоров: T (P)
- Ускорение как функция числа процессоров: S (P) = T (1) / T (P)
- Параллельная эффективность: E (P) = S (P) / P
Как вы выбираете «правильное» количество узлов? Это зависит от того, сколько заданий вам нужно выполнить, и какое допустимое использование вычислительных ресурсов.
Так, например, при составлении графика ваших результатов синхронизации вы можете обнаружить, что у вас есть минимальное время до завершения T (P) на некотором количестве процессоров - скажем, 32. Так что это может показаться «лучшим» выбором. Но когда вы посмотрите на показатели эффективности, может стать ясно, что эффективность начала резко падать задолго до этого; и вы получили (скажем) только 20-процентное сокращение времени выполнения по сравнению с работой на 16 процессорах - то есть, если вдвое увеличить объем вычислительных ресурсов, вы получили только 1,25-кратное увеличение скорости. Обычно это плохая сделка, и вы предпочитаете работать с меньшим количеством процессоров, особенно если у вас много таких симуляций. (Например, если у вас есть 2 симуляции для запуска, в этом случае вы можете выполнить их за 1,25 единицы времени вместо 2 единиц времени, запустив две симуляции на 16 процессорах одновременно, вместо того, чтобы запускать их по одной на 32 процессорах ).
С другой стороны, иногда у вас есть только пара пробежек, и время действительно имеет значение, даже если вы используете ресурсы неэффективно. Финансовое моделирование может быть таким - им нужны прогнозы для завтрашних рынков , сейчас , и у них есть деньги, чтобы использовать вычислительные ресурсы, даже если они не используются на 100% эффективно.
Некоторые из этих концепций обсуждаются в разделе «Введение в параллельное выполнение» любого учебного пособия по параллельному программированию; вот наш пример, https://support.scinet.utoronto.ca/wiki/index.php/Introduction_To_Performance