3

У меня есть задача вычисления, запрограммированная в Matlab, которая состоит из обработки больших объемов данных, которые считываются в память при запуске. Время выполнения находится в диапазоне от часов до дней. Задача однопоточная.

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

Мой вопрос: существует ли принципиальный способ выбрать одну из машин для выполнения задачи, с целью как можно быстрее завершить задачу?


Следующая часть была обновлена на основе ответа Доктора Рейхарда.

Моя грубая идея, как получить приблизительное представление о том, какая машина будет самой быстрой, состоит в том, чтобы объединить два аспекта:

(1) Оцените, какую часть ресурсов своей обработки машина выделит для моей задачи, если она будет выполняться там, что я называю "относительной скоростью": если машина простаивает, моя задача будет выполняться с относительной скоростью 1 по определению. Если текущая нагрузка равна L, а количество ядер равно C, после того, как я отправлю свою задачу, нагрузка будет L+1, а относительная скорость выполнения будет R = min(C / (L+1), 1). Оператор min, поскольку процесс не может использовать более одного ядра. - Является ли этот расчет правильным как показатель достижимой скорости обработки относительно оптимальной возможной на машине с учетом ее текущей нагрузки? И является ли соответствующее число C числом физических ядер или количеством виртуальных ядер, причем последнее в два раза больше из-за гиперпоточности?

(2) Оцените, насколько быстро задача будет выполнена относительно на разных машинах, если они все простаивают, на основе показателя производительности машины. Это должна быть не тактовая частота, а правильно выбранный тест.

Затем машина выбирается на основании того, какой из них имеет наибольшее произведение из числа (1) и (2).

1 ответ1

2

Это не будет иметь определенного ответа, главным образом из-за работы компьютеров, но я постараюсь дать некоторые рекомендации относительно того, как выяснить, что является самым быстрым.

Я проанализирую ваши высказывания, чтобы рассказать вам, что вы можете, а что не можете понять.

1. Данные

Из ваших первых параграфов вы заявили, что загрузили и прочитали все данные в и из памяти. Это хорошо для скорости, так как с точки зрения пропускной способности память не имеет себе равных. Если ваша программа использует диск (независимо от того, является ли он жестким диском, SSD или пером), это может стать причиной узкого места в скорости вашей программы.

Это связано со скоростью передачи. Оперативная память имеет практически прямой доступ к процессору. Диски должны проходить через соединение с пропускной способностью, намного меньшей, чем ОЗУ, а в случае жестких дисков есть время, необходимое для извлечения и хранения данных.

2. Операционные системы

Используемая ОС оказывает некоторое влияние на скорость, но может рассматриваться как остаточная.

3. Архитектура процессора (или наборы инструкций)

Это актуальный аспект. Хотя вы указали, что на машинах используются процессоры amd64, могут быть некоторые различия в используемых наборах команд.

Рассмотрим, например, процессоры серии Opteron и Sempron . Ключевое отличие в них заключается в том, что последний имеет поддержку SSE3 .

SSE3 предоставляет новые и более эффективные способы работы с данными (в частности, операции с массивами), операции, которые в более ранних наборах команд выполнялись бы с использованием менее эффективных процессов.

Таким образом, в этом аспекте новые процессоры быстрее проектируются, поскольку они поддерживают более эффективные наборы команд.

4. Загрузка системы

Это последний гвоздь в гробу, как вы могли бы выразиться. Вы не можете рассчитать нагрузку на компьютер линейным способом, если не знаете, как работает каждая программа. С учетом вышесказанного у вас может быть 10 000 запущенных процессов, но с остаточной нагрузкой или с одним многопоточным процессом, который тратит все процессорное время.

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

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

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

5. ЦПУ

Давайте рассмотрим ваши моменты: ядра и тактовую частоту процессора.

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

Я не знаю много о многопоточности, поэтому я оставлю это для тех, кто знает.

Тактовая частота не является четким показателем эффективности процессора. Чтобы обосновать это, я представляю вам "битву" между использованием процессора Intel и PowerPC в оборудовании Apple. Apple утверждала, что основной причиной предпочтения процессоров PowerPC Intel, несмотря на увеличение скоростей процессоров Intel, было то, что PowerPC работал лучше, потому что они могли обрабатывать больше операций в секунду, чем его конкурент. В конце концов, Apple выбрала Intel из-за проблем с питанием и других экономических факторов.

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

Однако это не очень разглашаемое количество (поскольку оно зависит от того, какие операции вы выполняете). Я нашел несколько тестов на Overclock.net. Я отмечаю эти два:

  • AMD Phenom Ix4 9850 с частотой 2,83 ГГц, ОЗУ 754 МГц, 5-5-5-15 GFLOPS:27,5
  • AMD Phenom IIx2 555 @ 4,12 ГГц, ОЗУ 1000 МГц, 5-5-5-18 GFLOPS:26

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

Нижняя линия

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

  • Быстрее хранить все (или в основном используемые) данные в оперативной памяти. (хранение данных является основным узким местом в любом процессе).
  • Чем меньше процессов запущено на одной машине, тем лучше.
  • Чем больше ядер, тем лучше.
  • Новые процессоры быстрее по дизайну.
  • Скорость процессора является приблизительным показателем скорости (поскольку вмешиваются задержки ОЗУ и другие факторы)
  • Вы можете попросить машину дать вашему процессу наивысший приоритет. Машина попытается выделить больше времени для вашего процесса. (когда я говорю « попробую», я имею в виду, что машина не обязана уделять вашему процессу больше времени, она пытается сбалансировать все, поэтому существует второй пункт).

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

  • Все процессы имеют одинаковую нагрузку.
  • Процессы не ждут ввода / вывода.
  • Предполагается, что скорость памяти не является фактором.
  • Все процессы однопоточные. У них одинаковый приоритет.

При этом узким местом станет емкость процессора. Таким образом, для любого процессора относительная нагрузка для любого процесса будет следующей:

R = min(C / N ; 1)

С R - относительная нагрузка, C - количество ядер в ЦП, а N - количество активных процессов. Это предполагает, однако, что система может равномерно и идеально распределять всю нагрузку по ядрам, что не всегда может быть правдой.

При относительной нагрузке на ЦП умножьте ее на выбранную вами единицу измерения (например, ГГц или GFLOPS), и затем вы получите показатель того, насколько "быстрым" может быть процесс.

Speed = R * UM

Итак, с этим ваша формула верна. Но, пожалуйста, довольно , пожалуйста, обратите внимание на количество предположений, которые я должен был сделать. Это далеко от реального случая. Это не даст вам точное количество, а, скорее, обоснованное предположение.

Ваш второй пункт совпадает с первым (на самом деле, вы отвечаете на свой вопрос). Короче говоря, это показатель эффективности аппарата (как R = 1 поэтому вопрос здесь в том , как выбрать один. Это то, что вы должны проанализировать сами: вы можете использовать число ядер в ГГц, или GFLOPS, или какую-то комбинацию этих двух.

Существуют программы (которые я должен был помнить ранее при написании первого ответа), которые могут выполнять некоторые тесты ЦП, и из них вы можете получить некоторые значения, которые могут помочь вашему решению. У меня есть SiSoftware Sandra (в моей довольно старой версии есть эталонный тест Processor Arithmetic), но я предполагаю, что есть и другие.

В этом случае умножение 1) и 2) не даст никакой разницы, если вы не используете разные единицы измерения.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .