Оптимальное количество потоков на ядро

CTRL + b: разрабатывать проект под C++

CTRL + SHIFT + f: отформатировать Ваш код (C++)

265
задан eduncan911 20 July 2012 в 07:46
поделиться

6 ответов

Если ваши потоки не выполняют ввод-вывод, синхронизацию и т. Д., И больше ничего не работает, 1 поток на ядро ​​обеспечит вам наилучшую производительность. Однако, скорее всего, это не так. Добавление большего количества потоков обычно помогает, но в какой-то момент они вызывают некоторое снижение производительности.

Не так давно я проводил тестирование производительности на двух четырехъядерном компьютере, на котором запущено приложение ASP.NET на Mono при довольно приличной нагрузке. Мы поиграли с минимальным и максимальным количеством потоков и в конце концов обнаружили, что для этого конкретного приложения в этой конкретной конфигурации лучшая пропускная способность составляет где-то между 36 и 40 потоками. Все, что выходит за эти границы, работает хуже. Урок выучен? На вашем месте я бы тестировал с другим количеством потоков, пока вы не нашли правильное число для вашего приложения.

Одно можно сказать наверняка: потоки 4k займут больше времени. Это много переключений контекста.

241
ответ дан 23 November 2019 в 02:28
поделиться

Фактическая производительность будет зависеть от того, сколько добровольных уступок будет выполнять каждый поток. Например, если потоки вообще НЕ выполняют операций ввода-вывода и не используют системные службы (т.е. они на 100% привязаны к процессору), то оптимальным вариантом будет 1 поток на ядро. Если потоки делают что-то, что требует ожидания, вам придется поэкспериментировать, чтобы определить оптимальное количество потоков. 4000 потоков потребуют значительных накладных расходов на планирование, так что это, вероятно, тоже не оптимально.

24
ответ дан 23 November 2019 в 02:28
поделиться

4000 потоков одновременно - это довольно много.

Ответ - да и нет. Если вы делаете много блокирующих операций ввода-вывода в каждом потоке, то да, вы можете показать значительное ускорение, делая, вероятно, до 3 или 4 потоков на логическое ядро.

Однако, если вы не делаете много блокирующих действий, тогда дополнительные накладные расходы на многопоточность просто сделают его медленнее. Поэтому используйте профилировщик и посмотрите, где узкие места в каждой, возможно, параллельной части. Если вы выполняете тяжелые вычисления, то использование более одного потока на процессор не поможет. Если вы много переносите память, это тоже не поможет. Если вы выполняете много операций ввода-вывода, например, для доступа к диску или доступа к Интернету, то да, несколько потоков в определенной степени помогут или, по крайней мере, сделают приложение более отзывчивым.

7
ответ дан 23 November 2019 в 02:28
поделиться

Benchmark.

Я бы начал увеличивать количество потоков для приложения, начиная с 1, а затем перейду к что-то вроде 100, запустите три-пять испытаний для каждого количества потоков и создайте себе график зависимости скорости работы от количества потоков.

Вы должны выбрать вариант с четырьмя потоками оптимальным, с небольшим увеличением времени выполнения после этого, а может и нет. Возможно, ваше приложение ограничено пропускной способностью, т. Е. Набор данных, который вы загружаете в память, огромен, вы получаете много промахов в кеше и т. Д., Поэтому оптимально использовать 2 потока.

Вы не можете узнать, пока не протестируете.

6
ответ дан 23 November 2019 в 02:28
поделиться

Идеальным вариантом является 1 поток на ядро, пока ни один из потоков не будет блокироваться.

Один случай, когда это может быть неверно: есть другие потоки, работающие на ядро, и в этом случае большее количество потоков может дать вашей программе больший кусок времени выполнения.

2
ответ дан 23 November 2019 в 02:28
поделиться

говоря с точки зрения вычислений и ограничения памяти (научные вычисления) 4000 потоков заставят приложение работать очень медленно. Частично проблема заключается в очень высоких накладных расходах на переключение контекста и, скорее всего, в очень плохой локализации памяти.

Но это также зависит от вашей архитектуры. Откуда я слышал, что процессоры Niagara, как предполагается, могут обрабатывать несколько потоков на одном ядре, используя какую-то передовую технику конвейерной обработки. Однако у меня нет опыта работы с этими процессорами.

0
ответ дан 23 November 2019 в 02:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: