Почему одно ядро процессора работает медленнее, чем другие?
я сравнивал большое научное приложение и обнаружил, что иногда оно будет работать на 10% медленнее при тех же входных данных. После долгих поисков я обнаружил, что замедление произошло только тогда, когда он работал на core #2 моего четырехъядерного процессора (в частности, Intel Q6600 работает на 2.4 GHz). Приложение является однопоточным и большую часть времени проводит в матричных математических процедурах с интенсивным процессором.
теперь, когда я знаю, что одно ядро медленнее других, я могу получить точный тест результаты путем установки сродства процессора к одному ядру для всех запусков. Тем не менее, я все еще хочу знать, почему одно ядро медленнее.
я попробовал несколько простых тестовых случаев, чтобы определить медленную часть процессора, но тестовые случаи выполнялись с одинаковым временем, даже на медленном ядре #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]; } } }
Вопрос: почему одно ядро процессора будет медленнее, чем другие, и какая часть процессора вызывает это замедление?
EDIT: больше испытания показали некоторые плавающая ошибка поведение. Когда я явно устанавливаю сродство процессора, мое приложение не замедляется на core #2. Однако, если он решает работать на core #2 без явно заданного сходства процессора, то приложение работает примерно на 10% медленнее. Это объясняет, почему мои простые тестовые случаи не показали такого же замедления, поскольку все они явно задают сродство процессора. Итак, похоже, что есть какой-то процесс, который любит жить на core #2, но он уходит с пути, если установлено сродство процессоров.
Итог: Если вам нужно иметь точный эталон однопоточной программы на многоядерной машине, то обязательно установите сродство процессора.
4 ответов
У вас могут быть приложения, которые решили быть подключены к тому же процессору(сродство процессора).
операционные системы часто хотели бы работать на одном процессоре, поскольку они могут кэшировать все свои данные в одном кэше L1. Если вам случится запустить процесс на том же ядре, что и ваша ОС, вы можете испытать эффект замедления производительности вашего процессора.
похоже, что какой-то процесс хочет придерживаться того же процессора. Сомневаюсь, что это проблема с оборудованием.
Это не обязательно должна быть ваша ОС, выполняющая работу, это может делать какой-то другой фоновый демон.
большинство современных процессоров имеют отдельное регулирование каждого ядра процессора из-за перегрева или функции энергосбережения. Вы можете попытаться отключить энергосбережение или улучшить охлаждение. Или, может быть, ваш процессор плохой. На моем i7 я получаю около 2-3 градусов разные температуры ядра 8, о которых сообщается в "датчиках". На полной нагрузке все еще изменение.
другая возможность заключается в том, что процесс переносится из одного ядра в другое во время работы. Я бы предложил установить сродство процессора к "медленному" ядру и посмотреть, так ли это быстро.
годы назад, до дней multicore, я купил себе двойной сокет Athlon MP для "веб-разработки". Внезапно мои веб-серверы Plone/Zope/Python замедлились до обхода. Поиск google показал, что интерпретатор CPython имеет глобальную блокировку интерпретатора, но потоки Python поддерживается потоками ОС. Потоки ОС были равномерно распределены между процессорами, но только один процессор может получить блокировку за раз, таким образом, все остальные процессы пришлось ждать.
установка сродства процессора Zope к любому процессору исправила проблему.
Я заметил что-то подобное на моем ноутбуке Haswel. В системе было тихо, никаких "Икс", только терминал. Выполнение одного и того же кода с разными numactl --physcpubin
опция дала точно такие же результаты на всех ядрах, кроме одного. Я изменил частоту ядер на Turbo, на другие значения, ничего не помогло. Все ядра работали с ожидаемой скоростью, за исключением одного, который всегда работал медленнее других. Этот эффект пережил перезагрузку.
я перезагрузил компьютер и включил выключен гиперпоточность в BIOS. Когда он вернулся в сеть, все снова было хорошо. Затем я включил HyperThreading, и до сих пор все в порядке.
Bizzare. Понятия не имею, что это может быть.