Почему три темы быстрее, чем 10+ - PullRequest
3 голосов
/ 01 марта 2012

Мой вопрос связан с проблемами производительности в многопоточности в среде Windows. После тестирования моего кода я получил результаты, что увеличение количества потоков не увеличивает производительность параллельных вычислений и стало меньше после некоторого подсчета. Что здесь происходит? Можно ли узнать формулу оптимального количества потоков: F (процессоры, память ..) =?

Ответы [ 6 ]

6 голосов
/ 01 марта 2012

Начнем с того, что у вашего ЦП есть аппаратное ограничение на количество потоков, которые он может выполнять одновременно (например, 4 для четырехъядерного процессора, вдвое больше, если у него есть HyperThreading), нет способа повысить производительность, создав больше потоков.чем у вас есть ядра.На самом деле, дополнительные потоки снижают производительность, как вы видели, потому что увеличиваются накладные расходы на планирование и синхронизацию потоков, в то время как работа, выполняемая за единицу времени, остается неизменной.

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

4 голосов
/ 01 марта 2012

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

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

2 голосов
/ 01 марта 2012

Причина, по которой потоки 10+ не обязательно быстрее, чем 3, заключается в том, что с каждым потоком связаны накладные расходы.Это управление самими потоками - обеспечение того, чтобы каждый получал соответствующее время обработки, и управление данными, передаваемыми между потоками.

Следовательно, чем больше у вас потоков, тем больше это не накладные расходы обработки.

Еслиу вас есть четырехъядерный процессор, тогда каждый из трех потоков может работать на ядре 100% времени каждый (это не будет правдой, но это пример).Однако с 9 потоками каждый поток может работать только на 33% времени на ядре - он должен делиться им с 2 другими.Затраты на управление этим означают, что 9 потоков на самом деле медленнее, чем 3.

2 голосов
/ 01 марта 2012

Если вы ищете формулы, есть закон Амдала :

Ускорение программы, использующей несколько процессоров в параллельных вычислениях, ограниченок времени, необходимому для последовательной доли программы.Например, если программе требуется 20 часов с использованием одного ядра процессора, а конкретную часть в 1 час нельзя распараллелить, а оставшуюся многообещающую часть в 19 часов (95%) можно распараллелить, то независимо от того, сколько процессоров мы выделяемдля параллельного выполнения этой программы минимальное время выполнения не может быть меньше критического 1 часа.

1 голос
/ 01 марта 2012

Трудно дать точное общее правило.Обычно больше потоков, чем ядер имеет смысл, если вы часто ждете (ввода-вывода или около того).Тем не менее, если вы по-настоящему вычисляете вещи, количество ядер будет хорошим.Большее количество потоков не ускоряет ЦП, но увеличивает планирование.

1 голос
/ 01 марта 2012

Вы можете взглянуть на Task Parallel Library в .NET 4.0.А если вы используете старую версию фреймворка, вы можете использовать пул потоков , чтобы избежать накладных расходов на ручное создание потока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...