Как выполнять те же вычисления быстрее на 4-ядерном ЦП: 4 потока или 50 потоков?

Предположим, у нас есть фиксированный объем вычислений, без блокировок, ожидания и ожидания ввода-вывода. Работу можно очень хорошо распараллелить - она ​​состоит из 100 миллионов небольших и независимых расчетных задач.

Что быстрее для 4-ядерного ЦП - запускать 4 потока или ...скажем 50? Почему второй вариант должен быть slover и сколько slover?

Как я предполагаю: когда вы запускаете 4 тяжелых потока на 4-ядерном ЦП без других процессов / потоков, потребляющих ЦП, планировщику разрешено вообще не перемещать потоки между ядрами ; у него нет причин делать это в данной ситуации. Core0 (основной ЦП) будет отвечать за выполнение обработчика прерывания для аппаратного таймера 250 раз в секунду (базовая конфигурация Linux) и других обработчиков аппаратных прерываний, но другие ядра могут не беспокоиться.

Какова стоимость переключения контекста? Пришло время хранить и восстанавливать регистры процессора для другого контекста? А как насчет кешей, конвейеров и различных вещей для прогнозирования кода внутри ЦП? Можно ли сказать, что каждый раз, когда мы переключаем контекст, мы повреждаем кеши, конвейеры и некоторые средства декодирования кода в ЦП? Значит, больше потоков выполняется на одном ядре, меньше работы они могут выполнять вместе по сравнению с их последовательным выполнением?

Вопрос о кэшах и другой аппаратной оптимизации в многопоточной среде - это сейчас для меня интересный вопрос.

7
задан pavelkolodin 7 February 2012 в 21:06
поделиться