Вопрос: Оптимальное количество потоков при многозадачности


Я знаю, что подобные вопросы заданы, но я думаю, что мое дело немного отличается.

Предположим, у меня есть компьютер с 8 ядрами и бесконечной памятью с ОС Linux.

У меня есть программное обеспечение для расчета, называемое гауссовым, которое может использовать многопоточность. Поэтому я установил количество потоков для 8 для одного вычисления для максимальной скорости. Однако я действительно не могу решить, что делать, когда мне нужно одновременно выполнить 8 вычислений. В этом случае я должен установить количество потоков в 1 (всего 8 потоков, порожденных в 8 процессах) или сохранить его 8 (всего 64 потока, порожденных в 8 процессах) для каждого задания? Это действительно имеет значение? Связанный с этим вопрос заключается в том, автоматически ли ОС автоматически загружает ядра для разных ядер для каждого потока?

РЕДАКТИРОВАТЬ: Я знаю, что бенчмаркинг - лучший способ узнать. Дело в том, что компьютеры принадлежат моему университету, поэтому они заняты все время. Другими словами, его рабочая нагрузка меняется неконтролируемым образом для меня, потому что другие люди используют эти компьютеры для своих вычислений, делая эксперименты невозможными. Также программное обеспечение очень дорого (1500 $ или что-то еще) и лицензировано для каждого компьютера, поэтому я не могу просто запустить тест на моем персональном компьютере ...


4
2017-10-24 01:37


Источник


Соблюдая (правильные и точные) ответы, нет гарантии, что программа будет работать лучше с максимальным количеством потоков, чем с одной (то есть она может быть запрограммирована лучше для одного потока, какая-то нить может замедлить процесс в целом и т. д.), хотя, если он запрограммирован, он должен, Как показывает общий консенсус, лучше всего протестировать каждую конфигурацию с ограниченным набором тестов. - Doktoro Reichard
Вы должны просто измерить его. - Der Hochstapler


Ответы:


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

Многие процессоры Intel поставляются с гиперпотоком, поэтому каждое ядро ​​может поддерживать два потока. Например, 8-ядерная система, которая поддерживает гиперпоточность, должна иметь 16 потоков, чтобы полностью использовать систему.


5
2017-10-26 11:55





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

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

Во время ожидания нить ничего не делает, поэтому ожидания будут отрицательно влиять на пропускную способность. В этом случае большее количество процессов и меньше потоков на процесс улучшит пропускную способность, поэтому 8x8 будет иметь лучшую производительность, чем 1x64.

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


3
2017-10-26 17:54



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


Правильное число зависит от того, сколько времени блокирует процессы в IO.

В книге «Программирование параллелизма на JVM» есть хорошая информация об этом:

«Определение количества потоков». Для большой проблемы мы хотели бы иметь как минимум столько потоков, сколько количество доступных ядер. Это позволит гарантировать, что столько ядер, сколько доступно для процесса, будут работать для решения нашей проблемы ...

Таким образом, минимальное количество потоков равно количеству доступных ядер. Если все задачи являются интенсивными вычислениями, то это все, что нам нужно. В этом случае большее количество потоков будет навредить, потому что ядра будут переключаться между потоками, когда еще есть работа. Если задачи интенсивны в IO, тогда у нас должно быть больше потоков.

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

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

Таким образом, мы можем вычислить общее количество потоков, которые нам понадобятся:

Количество потоков = Количество доступных ядер / (1 - Коэффициент блокировки)

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

В противном случае, если у вас есть оптимальное количество потоков для одного вычисления, но затем запустите 8 за раз, когда у вас может быть слишком много.

Лучшее решение - экспериментально сравнить его.

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


2
2017-10-29 21:09



Дело в том, что компьютеры принадлежат моему университету, поэтому он занят все время. Другими словами, его рабочая нагрузка для меня неконтролируема, потому что другие люди используют эти ПК для своих вычислений, делая эксперименты невозможными. - theGD
I / O далеко не единственный ресурс между потоками. - harrymc


Вы сами отвечаете на вопрос. «компьютеры принадлежат моему университету, поэтому они все время заняты»

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

Многопоточность всегда менее эффективна при вычислении на основе «вычислительной мощности» из-за перераспределения ресурсов контекста. Это только ускоряет проблемы для использования всех «свободных» незанятых ресурсов. Идея: используйте 8 компьютеров для запуска проблемы, вероятно, в 7,9 раза быстрее, что никогда не может превышать 8.

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

кстати, эгоистично, есть инструменты красной шляпы, которые вызывают сетку, которая может разделить ваше задание на все linux над кампусом. (> 200). Это будет работать так быстро, просто не поймайте, так как это замедлит всех. или использовать старые инструменты, параллельные математике.


1
2017-10-31 13:41