Разве не все процессоры созданы равными? - PullRequest
1 голос
/ 18 апреля 2011

Мой ноутбук имеет 4 логических процессора (два физических); логические ЦП 1 и 2 отображаются на ядро ​​1, а логические ЦП 3 и 4 - на ядро ​​2 (проверено с помощью GetLogicalProcessorInformation()).

Я запустил многопоточную программу умножения матриц на моем компьютере с двумя потоками. В первый раз я использовал SetProcessAffinityMask(hProcess, 0x5) (что означает логические процессоры 1 и 3), а во второй раз я использовал SetProcessAffinityMask(hProcess, 0xA) (логические процессоры 2 и 4).

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

Кто-нибудь догадывается, почему это может происходить?


Размеры:

  • Подключен (полный процессор):

    • Маска сродства: 0x3 (0011b), 9 гфлоп / с
    • Маска сродства: 0x5 (0101b), 17 гфлоп / с
    • Маска сродства: 0x6 (0110b), 17 гфлоп / с
    • Маска сродства: 0x9 (1001b), 9 гфлоп / с
    • Маска сродства: 0xA (1010b), 9 гфлоп / с
    • Маска сродства: 0xC (1100b), 9 гфлоп / с
  • На батарее (отключенной):

    • Маска сродства: 0x3 (0011b), 5 гфлоп / с
    • Маска сродства: 0x5 (0101b), 10 гфлоп / с
    • Маска сродства: 0x6 (0110b), 10 гфлоп / с
    • Маска сродства: 0x9 (1001b), 5 гфлоп / с
    • Маска сродства: 0xA (1010b), 2 гфлоп / с (-> Очень интересно, почему половина скорости, когда на аккумуляторе, но нормальная скорость на переменном токе ?!), в отличие от других, эта величина сильно варьируется между 1,5-2,5 гфлоп / с.
    • Маска сродства: 0xC (1100b), 5 гфлоп / с

Означает ли это, что четвертый логический процессор ничего не делает (!)? (Все с маской для четвертого набора процессоров идет медленно.)


Обновление:

Я только что запустил то же самое в профиле High Performance на батарейках . Результаты противоречивы: на этот раз я получил 2-кратное ускорение для масок 5, 6 и 10, но для маски 12 ускорения не было В результате получается комбинация управления питанием, Turbo Boost, несоответствий в расписании и т. д., и это более сложно измерить, чем я думал ранее. (

Ответы [ 4 ]

1 голос
/ 19 апреля 2011

Нет, не все ядра одинаковы. Только одно - загрузочное ядро. Кроме того, во многих случаях все IRQ (или, по крайней мере, IRQ от большинства устройств) направлены на одно ядро.


Более важно для вашего наблюдаемого поведения, не все наборы ядер равны. В архитектуре памяти NUMA (которая была относительно распространенной в x86 после Intel Hyperthreading и AMD Opteron), существует идеальная группа процессоров, которые могут эффективно обращаться к определенной области памяти, и все остальные процессоры будут платить значительные штрафы за доступ к этому диапазону .

При использовании Hyperthreading неравномерно подключается не основная системная память, а кэш L1 и L2. Если ваш процесс мигрирует между двумя виртуальными процессорами, связанными с одним и тем же физическим ядром, кэш остается действительным. Но если он мигрирует на другое физическое ядро, кэшированные данные должны быть скопированы, а право собственности перенесено в другой кеш. Для некоторых рабочих нагрузок это может иметь большое значение.

1 голос
/ 18 апреля 2011

SetProcessAffinityMask () не гарантирует, что у вас будет один поток на ядро;только то, что у вас есть потоки, которые будут работать на тех ядрах, которые вы разрешили.

Возможно, ОС работает по-другому.

Кроме того, я удивлен, 1 и 2 находятся на ядре 1. ОбычноНомера логических процессоров чередуются по физическим ядрам, чтобы обеспечить внутреннюю балансировку нагрузки.Я ожидаю, что 1 и 3 будут на ядре 1, 2 и 4 будут на ядре 2.

0 голосов
/ 19 апреля 2011

Вы проверили код возврата от SetProcessAffinityMask, чтобы увидеть, была ли ошибка? Если вызов не удался, вы можете застрять на одном логическом процессоре. Согласно документации , вы можете использовать только те биты, которые установлены в результате GetProcessAffinityMask.

Вы говорите, что пробовали маски 0x5, 0xA и 0x9. Мне было бы любопытно увидеть результаты с 0x3.

0 голосов
/ 19 апреля 2011

Было бы хорошо узнать, что это за физический процессор, но из ваших слов о логических процессорах я предполагаю, что есть 1 физический сокет, 2 ядра ЦП и включена поддержка гиперпоточности, что дает вам 4 логических процессора.

Краткий ответ: для этого сложного определения «процессор» нет, не все процессоры созданы равными. Гиперпоточные логические ядра совместно используют ресурсы выполнения, и если есть конкуренция за эти ресурсы, они не будут быстрыми как отдельные физические ядра. Это совместное использование может происходить на разных уровнях как для многопоточных, так и для многоядерных процессоров (ALU, ресурсы выполнения, кэш на разных уровнях и т. Д.), Но в общих чертах физические ядра в одном сокете не будут сильно подвержены влиянию другого ядра ( s) выполняет / выполняет, и то, что делает их гипертвин, сильно повлияет на логические ядра, реализованные с помощью гиперпоточности.

Еще одно различие между разными процессорами: как сказал Бен, ваша ОС может обрабатывать большинство аппаратных прерываний на одном процессоре, что означает, что процессор будет работать медленнее для других целей, но я был бы удивлен, если нагрузка прерывания будет достаточной для воздействия производительность где-то близко к этому много.

Результаты, которые вы получили - на процессорах A и B (будучи преднамеренно неоднозначными относительно того, что это за 2 процессора), вы получаете удвоенную производительность только для A, но на процессорах A и C вы получаете примерно ту же производительность, что и для A - - разница в том, что звук похож на гиперпоточность, где A и C - гипертвины в одном физическом ядре, а B - в другом физическом ядре. Вы сказали, что GetLogicalProcessorInformation () утверждает иное, но это не неслыханно для таблиц BIOS, в которых это зависит от ошибок.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...