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