Я запускаю следующий код как на своем ноутбуке Precision 5520, так и на c2-standard-4 Google Compute Engine:
import multiprocessing as mp
import time
def foo():
before = time.time()
sum = 0
for i in range(1, 100000000):
sum += i
print(time.time() - before, sum)
for i in range(mp.cpu_count()):
mp.Process(target=foo).start()
В обоих случаях mp.cpu_count()
равно 4. Однако неожиданно для меня каждое вычисление на ноутбуке занимает 5,2 секунды, а на GCE — 8,6 секунды.
Ноутбук работает под управлением Xeon E3-1505M v6 с частотой 3 ГГц. Это мощный ЦП, но я ожидаю, что ЦП ноутбука не может сравниться с ЦП на сервере Google HPC (например, из-за ограничений по теплу).
Версия Python на ноутбуке — 3.8.5. GCE имеет Python версии 3.9.2.
Почему это может быть так?
Обновлять После ответа @John Hanley я изменил конфигурацию в Google Cloud Platform, чтобы она использовала только один виртуальный ЦП на ядро, а время теперь составляет 4 секунды вместо 8,6. Это удивительно, так как, кажется, подрывает всю идею использования гиперпотоков...
Является ли версия Python такой же (есть существенные скачки даже между младшими версиями)? Какой процессор у вашего ноутбука (некоторые модели Precision оснащены довольно мощными процессорами Xeon)? Одинаково ли нагревается кеш в обоих случаях (было бы несправедливо сравнивать первый запуск с третьим)? Равна ли фоновая рабочая нагрузка в этих тестах (запускаются ли какие-либо службы на экземпляре GCE)?
@Marat Это только сумма, поэтому я считаю, что кеш не имеет значения.
@AlwaysLearning Дедупликация памяти
@TimRoberts Я добавил к вопросу информацию о процессоре.
@Marat Марат, я до сих пор не понимаю, почему прогрев кеша может иметь значение для этого примера ...
@AlwaysLearning При первом запуске будут созданы страницы памяти с определенным содержимым. Страницы не освобождаются сразу (зависит от реализации, я не знаю, как это реализовано в GCE), поэтому последующие запуски, скорее всего, будут использовать их повторно. Если это, даже теоретически, может повлиять на скорость выполнения, возможно, стоит контролировать этот фактор.
@Marat Сколько времени может занять создание одной страницы памяти?..
На вашем ноутбуке каждое ядро ЦП — это два Hyper-Threads.
В облаке один виртуализированный ЦП (vCPU) — это один Hyper-Thread.
Ваш ноутбук с той же материнской платой, тактовой частотой, памятью и т. д. имеет эквивалентную мощность ЦП на процессор в два раза больше. Когда вы настраиваете VCPU в облаке, вы настраиваете половину физического ядра ЦП.
On Compute Engine, each virtual CPU (vCPU) is implemented as a single hardware multithread on one of the available CPU processors. On Intel Xeon processors, Intel Hyper-Threading Technology supports multiple app threads running on each physical processor core. You configure your Compute Engine VM instances with one or more of these multithreads as vCPUs. The specific size and shape of your VM instance determines the number of its vCPUs.
Платформы облачных процессоров Google
Мне интересно, почему вы думаете, что это объясняет его результаты. Наличие двух гиперпотоков не удваивает СКОРОСТЬ данного ЦП. Это позволяет ему запускать больше процессов, но никак не влияет на скорость одного процесса.
@TimRoberts - потому что система, работающая на одном ядре с двумя гиперпотоками и не разделяющая ядро с двумя одновременными потоками, будет быстрее, чем ЦП в облаке с двумя потоками, работающими на одном ядре. ВМ A и ВМ B могут использовать одно и то же физическое ядро, что снижает производительность каждого виртуального ЦП. Если два гиперпотока потребляют более 50% каждый, вы не получаете более 100% от одного ядра.
Я думаю, что у меня отключена гиперпоточность, так как диспетчер задач в Windows показывает, что есть четыре логических процессора...
@TimRoberts - переписать мой последний комментарий. На его ноутбуке один поток может потреблять до 100% ресурсов одного ядра. В облаке один поток может потреблять в среднем до 50 % ресурсов одного ядра.
@AlwaysLearning — отключение Hyper-Threading не снизит производительность одного потока, привязанного к ЦП. В Windows запустите диспетчер задач. Перейдите на вкладку Спектакль. Под графикой ищите два предмета; ядра и Логические процессоры. Если вы отключили Hyper-Threading, проверьте, почему вы хотите его отключить.
@JohnHanley - я допускаю, что два процесса, работающих на двух гиперпотоках одного ядра, получают меньшую производительность, чем два процесса, работающих на двух отдельных ядрах, но (A) штраф нигде не составляет ПОЧТИ 50%, иначе гиперпотоки были бы глупой идеей, и (B) эти другие гиперпотоки, вероятно, заняты чем-то другим.
@TimRoberts - эта логика не применяется к виртуализации, где использование ЦП может регулироваться / управляться гипервизором. Это одна из причин, по которой вы видите режимы лопаться в облаке, где виртуальный ЦП может превышать 100%, что на самом деле составляет только 50% ядра ЦП. Поставщик облачных услуг предоставляет одному виртуальному ЦП больше ресурсов, чем другому виртуальному ЦП, в течение определенного периода времени.
Смотрите обновление внизу вопроса...
@AlwaysLearning — что вы изменили?
Соотношение виртуальных ЦП и ядер — 1 виртуальный ЦП на ядро
@AlwaysLearning - где вы это изменили?
В веб-интерфейсе Edit->Details->Machine Configuration
Я нахожу подозрительным число 5,2 секунды. Мой процессор Intel Xeon Silver 4110 лучше, чем i7-7700 в вашем ноутбуке, и для первого результата (из 16) требуется 6,4 секунды. (Кстати, для более безопасного использования в мп у вас должны быть последние две строки в
if __name__ == '__main__':
.)