Одна из возможных причин, по которым вы можете видеть большую производительность от нескольких потоков на одном процессоре, заключается в том, что процессоры, как правило, действительно хороши при переупорядочении команд и использовании параллелизма на уровне инструкций. В потоках меньше зависимостей данных и управления по отношению друг к другу, чем от любых двух последовательных инструкций в рамках одного потока, и поэтому они предлагают больше возможностей для планировщиков CPU и OS-уровня и механизмов переупорядочения, чтобы быть очень умными.
Не забывайте, что такие вещи, как «чтение и запись в память», по-прежнему остаются «вводом/выводом» при просмотре определенным образом. Это относительно медленные операции, и большая часть конвейерной обработки в современных процессорах используется, чтобы скрыть задержку памяти - одновременное выполнение нескольких потоков может быть полезно для заполнения времени, которое в противном случае было бы заполнено слотами задержки, в которых есть опасность для данных в пределах один поток.
Это говорит о том, что нити часто являются не хорошим решением для повышения производительности и могут иметь точно противоположный эффект. При некоторых проблемах может быть очень просто насытить всю доступную пропускную способность памяти, используя один поток.
У вас больше шансов обниматься с планировщиком? :) –
даже некоторые из одиночных ядер могут выполнять несколько потоков. см. гиперпоточность. –
Хорошо спроектированное однопроцессорное/однопоточное приложение может заставить крик процессора, если он позаботится о том, чтобы минимизировать промахи в кэше и тому подобное. Я думаю, что это действительно зависит от того, как написан код и микрооптимизации. –