Правило для ниток полягає в тому, що ви хочете, щоб принаймні один "активний" (здатний негайно виконувати його команди за вказаний час процесора) робочий потік для кожного "блоку виконання", доступного на комп'ютері. "Одиниця виконання" - це один логічний процесор інструкцій, тому чотириядерний чотириядерний сервер Xeon з гіпертоком має 32 ЄС (4 мікросхеми, 4 ядра на мікросхемі, кожна з гіперпотоків). У вашому середньому Core i7 було б 8.
Один потік в ЄС - це найповніше використання потужності процесора за умови, що потоки завжди будуть у робочому стані; це майже ніколи не відбувається, оскільки потокам потрібен доступ до некешованої пам’яті, жорсткого диска, мережевих портів і т. д., яких вони повинні чекати, і для цього не потрібна активна увага процесора. Таким чином, ви можете додатково підвищити загальну ефективність за допомогою більшої кількості потоків, що стоять у черзі, та йдуть вперед. Це дійсно доходить; коли CPU перемикає потік, він повинен кешувати регістри потоку, покажчик виконання та іншу інформацію про стан, яка зазвичай зберігається в найсумісніших роботах ЄС і дуже швидко отримує доступ, дозволяючи іншим членам ЄС у цьому чіпі CPU забрати його. Також потрібні потоки в ОС, щоб вирішити, на який потік слід перейти. Нарешті, коли ЄС перемикає нитки, він втрачає підвищення продуктивності конвеєрних труб, якими користується більшість процесорних архітектур; перед перемиканням ниток він повинен промивати трубопровід. Але оскільки все це в середньому займає набагато менше часу, ніж просто чекати, коли жорсткий диск або навіть оперативна пам’ять повернуться з інформацією, це вартує витрат.
Однак, як правило, як тільки ви перевищуєте вдвічі більше «активних» потоків, ніж ЄС, ОС починає витрачати більше часу потоків планування ЄС, і ЄС витрачає більше часу на перемикання між ними, ніж фактично витрачається на активні потоки програм. Це точка неекономії масштабу; фактично знадобиться більше часу для запуску багатопотокового алгоритму, якщо ви до цього часу додали додатковий потік.
Таким чином, загалом ви хочете підтримувати принаймні стільки ниток у вашій програмі, скільки у вас є ЄС на комп’ютері, але ви хочете, щоб уникнути більше, ніж удвічі більше, ніж кількість, яка не чекає і не спить.