Почему больше потоков, чем ядер, быстрее?

Я реализовал версию PageRank в многопоточной версии. Я запускаю его на 4-ядерном Q6600. Когда я запускаю его для создания 4 потоков, я получаю:

real    6.968s
user   26.020s
sys     0.050s

Когда я запускаю 128 потоков, я получаю:

real    0.545s
user    1.330s
sys     0.040s

Это не имеет для меня смысла. Основным алгоритмом является уменьшение суммы:

  1. Все потоки суммируют подмножество входных данных;
  2. Синхронизируют;
  3. Каждый поток затем накапливает часть результатов из других потоков;
  4. Основной поток суммирует промежуточное значение из всех потоков, а затем определяет, продолжать ли.

Профилирование не помогло. Я не уверен, какие данные были бы полезны для понимания моего кода - просто спросите.

Это действительно меня озадачило.

7
задан Jim Ferrans 13 May 2011 в 05:18
поделиться