Почему одно ядро ​​процессора работает медленнее других? - PullRequest
8 голосов
/ 13 мая 2009

Я тестировал большое научное приложение и обнаружил, что оно иногда будет работать на 10% медленнее при тех же затратах. После долгих поисков я обнаружил, что замедление произошло только тогда, когда оно работало на ядре № 2 моего четырехъядерного процессора (в частности, на Intel Q6600, работающем на частоте 2,4 ГГц). Приложение является однопоточным и проводит большую часть времени в математических процедурах с интенсивным использованием ЦП.

Теперь, когда я знаю, что одно ядро ​​медленнее других, я могу получить точные результаты тестов, установив привязку процессора к одному и тому же ядру для всех запусков. Однако я все еще хочу знать, почему одно ядро ​​работает медленнее.

Я попробовал несколько простых тестовых случаев, чтобы определить медленную часть ЦП, но тестовые случаи выполнялись с одинаковым временем, даже на медленном ядре №2. Только сложное приложение показало замедление. Вот тестовые примеры, которые я пробовал:

  • Умножение и сложение с плавающей запятой:

    accumulator = accumulator*1.000001 + 0.0001;
    
  • Тригонометрические функции:

    accumulator = sin(accumulator);
    accumulator = cos(accumulator);
    
  • Целочисленное сложение:

    accumulator = accumulator + 1;
    
  • Копирование памяти при попытке пропустить кэш L2:

    int stride = 4*1024*1024 + 37;  // L2 cache size + small prime number
    for(long iter=0; iter<iterations; ++iter) {
        for(int offset=0; offset<stride; ++offset) {
            for(i=offset; i<array_size; i += stride) {
                array1[i] = array2[i];
            }
        }
    }
    

Вопрос: Почему одно ядро ​​ЦП будет медленнее других, и какая часть ЦП вызывает такое замедление?

РЕДАКТИРОВАТЬ: Дальнейшее тестирование показало некоторые Гейзенбаг поведение. Когда я явно устанавливаю привязку к процессору, мое приложение не замедляется на ядре № 2. Однако, если он выберет работу на ядре № 2 без явно установленной привязки процессора, то приложение будет работать примерно на 10% медленнее. Это объясняет, почему в моих простых тестовых примерах не было такого же замедления, поскольку все они явно устанавливали привязку процессора. Таким образом, похоже, что существует какой-то процесс, который любит жить на ядре № 2, но он исчезает, если установлено сходство процессора.

Итог: Если вам нужен точный тест однопоточной программы на многоядерном компьютере, то обязательно установите привязку процессора.

Ответы [ 4 ]

7 голосов
/ 13 мая 2009

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

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

Звучит так, будто какой-то процесс хочет придерживаться того же процессора. Я сомневаюсь, что это аппаратная проблема.

Это не обязательно должна быть ваша ОС, выполняющая работу, это может делать другой фоновый демон.

2 голосов
/ 13 мая 2009

Большинство современных процессоров имеют отдельный дросселирование каждого ядра процессора из-за перегрева или энергосбережения. Вы можете попробовать отключить энергосбережение или улучшить охлаждение. Или, может быть, ваш процессор плохой. На моем i7 я получаю около 2-3 градусов разных температур ядра из 8 зарегистрированных ядер в «датчиках». При полной загрузке все еще есть вариация.

1 голос
/ 15 мая 2009

Другая возможность состоит в том, что процесс переносится из одного ядра в другое во время работы. Я бы предложил установить привязку ЦП к «медленному» ядру и посмотреть, будет ли он таким же быстрым.

Несколько лет назад, до дней многоядерности, я купил себе Athlon MP с двумя сокетами для «веб-разработки». Внезапно мои веб-серверы Plone / Zope / Python замедлились. Поиск в Google обнаружил, что интерпретатор CPython имеет глобальную блокировку интерпретатора, но потоки Python поддерживаются потоками ОС. Потоки ОС были равномерно распределены между процессорами, но только один процессор может одновременно получить блокировку, поэтому все остальные процессы должны были ждать .

Установка соответствия Zope CPU любому процессору устранила проблему.

0 голосов
/ 28 ноября 2014

Я наблюдал нечто похожее на своем ноутбуке Haswel. Система была тихой, X не работал, только терминал. Выполнение одного и того же кода с другой опцией numactl --physcpubin дало абсолютно одинаковые результаты на всех ядрах, кроме одного. Я изменил частоту ядер на Turbo, на другие значения ничего не помогло. Все ядра работали с ожидаемой скоростью, кроме одного, которое всегда работало медленнее, чем остальные. Этот эффект пережил перезагрузку.

Я перезагрузил компьютер и отключил HyperThreading в BIOS. Когда он вернулся в сеть, все снова было хорошо. Затем я включил HyperThreading, и до сих пор все нормально.

Bizzare. Понятия не имею, что это может быть.

...