Почему процессор Google Compute Engine, оптимизированный для вычислений, медленнее ноутбука при обработке чисел в Python

Я запускаю следующий код как на своем ноутбуке 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. Это удивительно, так как, кажется, подрывает всю идею использования гиперпотоков...

Я нахожу подозрительным число 5,2 секунды. Мой процессор Intel Xeon Silver 4110 лучше, чем i7-7700 в вашем ноутбуке, и для первого результата (из 16) требуется 6,4 секунды. (Кстати, для более безопасного использования в мп у вас должны быть последние две строки в if __name__ == '__main__':.)

Tim Roberts 05.05.2022 22:25

Является ли версия Python такой же (есть существенные скачки даже между младшими версиями)? Какой процессор у вашего ноутбука (некоторые модели Precision оснащены довольно мощными процессорами Xeon)? Одинаково ли нагревается кеш в обоих случаях (было бы несправедливо сравнивать первый запуск с третьим)? Равна ли фоновая рабочая нагрузка в этих тестах (запускаются ли какие-либо службы на экземпляре GCE)?

Marat 05.05.2022 22:26

@Marat Это только сумма, поэтому я считаю, что кеш не имеет значения.

AlwaysLearning 05.05.2022 22:28

@AlwaysLearning Дедупликация памяти

Marat 05.05.2022 22:39

@TimRoberts Я добавил к вопросу информацию о процессоре.

AlwaysLearning 05.05.2022 22:41

@Marat Марат, я до сих пор не понимаю, почему прогрев кеша может иметь значение для этого примера ...

AlwaysLearning 05.05.2022 22:46

@AlwaysLearning При первом запуске будут созданы страницы памяти с определенным содержимым. Страницы не освобождаются сразу (зависит от реализации, я не знаю, как это реализовано в GCE), поэтому последующие запуски, скорее всего, будут использовать их повторно. Если это, даже теоретически, может повлиять на скорость выполнения, возможно, стоит контролировать этот фактор.

Marat 05.05.2022 22:55

@Marat Сколько времени может занять создание одной страницы памяти?..

AlwaysLearning 06.05.2022 00:22
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
8
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

На вашем ноутбуке каждое ядро ​​ЦП — это два 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

Мне интересно, почему вы думаете, что это объясняет его результаты. Наличие двух гиперпотоков не удваивает СКОРОСТЬ данного ЦП. Это позволяет ему запускать больше процессов, но никак не влияет на скорость одного процесса.

Tim Roberts 05.05.2022 22:19

@TimRoberts - потому что система, работающая на одном ядре с двумя гиперпотоками и не разделяющая ядро ​​с двумя одновременными потоками, будет быстрее, чем ЦП в облаке с двумя потоками, работающими на одном ядре. ВМ A и ВМ B могут использовать одно и то же физическое ядро, что снижает производительность каждого виртуального ЦП. Если два гиперпотока потребляют более 50% каждый, вы не получаете более 100% от одного ядра.

John Hanley 05.05.2022 22:28

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

AlwaysLearning 05.05.2022 22:35

@TimRoberts - переписать мой последний комментарий. На его ноутбуке один поток может потреблять до 100% ресурсов одного ядра. В облаке один поток может потреблять в среднем до 50 % ресурсов одного ядра.

John Hanley 05.05.2022 22:35

@AlwaysLearning — отключение Hyper-Threading не снизит производительность одного потока, привязанного к ЦП. В Windows запустите диспетчер задач. Перейдите на вкладку Спектакль. Под графикой ищите два предмета; ядра и Логические процессоры. Если вы отключили Hyper-Threading, проверьте, почему вы хотите его отключить.

John Hanley 05.05.2022 22:39

@JohnHanley - я допускаю, что два процесса, работающих на двух гиперпотоках одного ядра, получают меньшую производительность, чем два процесса, работающих на двух отдельных ядрах, но (A) штраф нигде не составляет ПОЧТИ 50%, иначе гиперпотоки были бы глупой идеей, и (B) эти другие гиперпотоки, вероятно, заняты чем-то другим.

Tim Roberts 05.05.2022 22:41

@TimRoberts - эта логика не применяется к виртуализации, где использование ЦП может регулироваться / управляться гипервизором. Это одна из причин, по которой вы видите режимы лопаться в облаке, где виртуальный ЦП может превышать 100%, что на самом деле составляет только 50% ядра ЦП. Поставщик облачных услуг предоставляет одному виртуальному ЦП больше ресурсов, чем другому виртуальному ЦП, в течение определенного периода времени.

John Hanley 05.05.2022 22:45

Смотрите обновление внизу вопроса...

AlwaysLearning 05.05.2022 23:41

@AlwaysLearning — что вы изменили?

John Hanley 06.05.2022 00:05

Соотношение виртуальных ЦП и ядер — 1 виртуальный ЦП на ядро

AlwaysLearning 06.05.2022 00:19

@AlwaysLearning - где вы это изменили?

John Hanley 06.05.2022 01:12

В веб-интерфейсе Edit->Details->Machine Configuration

AlwaysLearning 06.05.2022 09:17

Другие вопросы по теме