
У меня есть задача вычисления, запрограммированная в Matlab, которая состоит из обработки больших объемов данных, считываемых в память при запуске. Время выполнения находится в диапазоне от часов до дней. Задача однопоточная.
Для выполнения этой задачи у меня есть несколько разных машин Linux в моем распоряжении. Машины находятся под разной нагрузкой из-за уже запущенных задач, которые будут продолжать работать в обозримом будущем. Все машины имеют архитектуру amd64, но они различаются по количеству физических ядер, количеству виртуальных ядер и модели ЦП, включая тактовую частоту и другие факторы.
Мой вопрос:Существует ли принципиальный способ выбора одной из машин для выполнения задачи с целью ее скорейшего завершения?
Следующая часть была обновлена на основе ответа Доктора Райхарда.
Моя грубая идея, как получить приблизительное представление о том, какая машина будет самой быстрой, заключается в объединении двух аспектов:
(1) Оцените, какую часть своих вычислительных ресурсов машина выделила бы моей задаче, если бы работала там, что я называю «относительной скоростью»: Если машина простаивает, моя задача будет выполняться с относительной скоростью 1 по определению. Если текущая загрузка равна L, а количество ядер равно C, после того, как я отправлю свою задачу, загрузка будет равна L+1, а относительная скорость выполнения будет равна R = min(C / (L+1), 1). Оператор min, потому что процесс не может использовать более одного ядра. – Корректен ли этот расчет как показатель достижимой скорости обработки относительно оптимально возможной на машине с учетом ее текущей загрузки? И является ли соответствующее число C количеством физических ядер или количеством виртуальных ядер, причем последнее в два раза больше из-за гиперпоточности?
(2) Оцените, насколько быстро будет выполняться задача относительно на разных машинах, если бы они все простаивали, на основе показателя производительности машины. Это должна быть не тактовая частота, а правильно выбранный эталон.
Затем выбирается машина на основе того, у какой из них произведение чисел (1) и (2) наибольшее.
решение1
На этот вопрос нельзя дать однозначного ответа, в основном из-за особенностей работы компьютеров, но я попытаюсь дать некоторые рекомендации, как выяснить, какой из них самый быстрый.
Я проанализирую ваши утверждения, чтобы сказать, что вы можете понять, а что нет.
1. Данные
В первых абзацах вы заявили, что загружаете и считываете все данные в память и из нее. Это хорошо для скорости, так как с точки зрения пропускной способности память не имеет себе равных. Если ваша программа использует диск (независимо от того, HDD это, SSD или флешка), то это может быть узким местом в скорости работы вашей программы.
Это связано со скоростью передачи данных. ОЗУ имеет практически прямой доступ к процессору. Диски должны проходить через соединение с пропускной способностью, намного меньшей, чем у ОЗУ, а в случае с жесткими дисками необходимо учитывать время, необходимое для извлечения и сохранения данных.
2. ОС
Используемая ОС оказывает некоторое влияние на скорость, но его можно считать остаточным.
3. Архитектура процессора (или наборы инструкций)
Это важный аспект. Хотя вы и заявили, что машины используют процессоры amd64, могут быть некоторые различия в используемых наборах инструкций.
Рассмотрим, например,ОптерониСемпронсерии процессоров. Ключевое отличие в них в том, что последний имеетSSE3поддерживать.
SSE3 обеспечивает более новые и эффективные способы работы с данными (в частности, операции с массивами), операции, которые в более ранних наборах инструкций выполнялись бы с использованием менее эффективных процессов.
Итак, в этом аспекте,новеепроцессоры естьбыстрее по замыслу, поскольку они поддерживают более эффективные наборы инструкций.
4. Нагрузка на систему
Это последний гвоздь в крышку гроба, как вы могли бы сказать. Вы не можете рассчитать нагрузку на компьютере линейным способом, если вы не знаете, как работает каждая программа. С учетом вышесказанного, у вас может быть запущено 10 000 процессов, но с остаточной нагрузкой или с одним многопоточным процессом, тратящим все процессорное время.
Однако... давайте проанализируем это дальше. Добавление процессов подразумевает добавление некоторых данных в базовую систему, чтобы она знала, что процесс существует и сколько процессорного времени должно быть подготовлено для него. В этом аспекте,меньше процессовявляютсялучшедля скорости, поскольку ядро/процессор могут лучше решить, сколько времени выделить.
Еще один момент, который следует учитывать, — это приоритет, который ядро дает процессам. Процессы с наибольшим приоритетом будут занимать большую часть времени процессора.
В конечном итоге вы можете представить себе систему, которая может дать вашему процессу максимальный приоритет и оставить все остальные процессы ждать вечно, пока ваш процесс не остановится. В этом случае скорость вашего процесса будет определяться процессором.
5. Процессор
Давайте рассмотрим ваши моменты: ядра и тактовая частота процессора.
Можно предположить, что ядро может перенести некоторые процессы на другие ядра. В предельном случае ваш процесс может иметь целое ядро, назначенное ему. В этом аспекте большее количество ядер может позволить большему количеству процессов работать одновременно (и, как следствие, быстрее).
Я не очень разбираюсь в многопоточности, поэтому оставлю это тому, кто знает.
Тактовая частотане являетсяявный показатель эффективности процессора. Чтобы обосновать это, я представляю вам «битву» между использованием процессоров Intel и PowerPC в оборудовании Apple. Apple утверждала, что основной причиной предпочтения процессоров PowerPC процессорам Intel, несмотря на увеличение скорости процессоров Intel, было то, что PowerPC работали лучше, поскольку они могли обрабатывать больше операций в секунду, чем его конкурент. В конце концов, Apple выбрала Intel из-за проблем с питанием и других экономических факторов.
ПРОВАЛЫ(для операций с плавающей точкой в секунду) — это мера производительности компьютера, особенно в областях научных расчетов, которые интенсивно используют вычисления с плавающей точкой, аналогичные старым, более простым инструкциям в секунду. Это может быть лучшей мерой, чем тактовая частота, если ваша работа в значительной степени зависит от таких операций, которые для вас, использующих Matlab, могут быть возможными.
Однако это не очень разглашаемая величина (так как она зависит откакого родаоперации вы выполняете). Я нашел некоторые контрольные показатели наOverclock.net. Я указываю на эти два:
- AMD Феном IX4 9850 @2.83ГГцОперативная память 754 МГц 5-5-5-15ГФЛОПС:27,5
- AMD Phenom IIx2 555 @4.12ГГцОперативная память 1000МГц 5-5-5-18ГФЛОПС:26
Как видите, даже процессоры с вдвое большей скоростью могут работать хуже процессоров с вдвое меньшей скоростью.
Нижняя граница
Нет четкой формулы.вы можете использовать для оценки времени выполнения, из-за бесконечного количества факторов, участвующих в обработке программы. Есть некоторые правила, которые я суммирую (я попытался отсортировать их поважность):
- Быстрее хранить все (или большую часть используемых) данные в оперативной памяти (хранение данных — главное узкое место в любом процессе).
- Чем меньше процессов запущено на одном компьютере, тем лучше.
- Больше ядер — лучше.
- Новые процессоры изначально более быстрые.
- Скорость процессора - этогрубыйпоказатель скорости (поскольку влияют задержка оперативной памяти и другие факторы)
- Вы можете попросить машину дать вашему процессу наивысший приоритет. Машинапопытаюсьчтобы выделить больше времени на ваш процесс. (когда я говорюпопытаюсь, я имею в виду, что машина не обязана давать вашему процессу больше времени, она пытается все сбалансировать, поэтому и существует 2-й пункт).
Я все еще немного колеблюсь, чтобы дать вам полную формулу, но я думаю, что я могу дать вамочень, очень приблизительноодин, основываясь на выводе ваших комментариев. Я не могу говорить о многопоточности, поэтому я буду считать все ядра независимыми. Для этой демонстрации предполагается следующее:
- Все процессы имеют одинаковую нагрузку.
- Процессы не ждут ввода/вывода.
- Скорость памятипредполагаетсяне быть фактором.
- Все процессы однопоточные. Имеют одинаковый приоритет.
При этом узким местом будет мощность ЦП. Таким образом, для любого ЦП относительная нагрузка для любого процесса будет следующей:
R = min(C / N ; 1)
При этом R — относительная нагрузка, C — количество ядер в ЦП, а N — количество активных процессов. Однако это предполагает, что система может равномерно и идеально распределить всю нагрузку по ядрам, что не всегда может быть правдой.
Умножьте относительную нагрузку на ЦП на единицу измерения (ЕИ) по вашему выбору (например, ГГц или ГФЛОПС), и вы получите меру того, насколько «быстрым» может быть процесс.
Speed = R * UM
Итак, с этим ваша формула верна. Но, пожалуйста,пожалуйстаобратите внимание на количество предположений, которые мне пришлось сделать. Это далеко от реального случая. Это не даст вам точного количества, но скорееобоснованное предположение.
Ваш второй пункт такой же, как и первый (на самом деле, вы отвечаете на него своим вопросом). Короче говоря, этоявляетсяпоказатель производительности машины (как R = 1
), поэтому вопрос здесь в том, как выбрать один. Это то, что вы должны проанализировать сами: вы можете использовать ГГц, умноженные на количество ядер, или GFLOPS, или некоторую комбинацию этих двух.
Есть программы (о которых я должен был вспомнить раньше, когда писал первый ответ), которые могут делать некоторые бенчмарки на ЦП, и из них вы можете получить некоторые значения, которые могут помочь вашему решению. У меня есть SiSoftware Sandra (в моей довольно старой версии есть бенчмарк процессорной арифметики), но я полагаю,есть и другие.
В этом случае умножение 1) и 2) не даст никакой разницы, если только вы не используете разные единицы измерения.