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

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

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

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

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

20
задан theGD
15.01.2023 16:43 Количество просмотров материала 2468
Распечатать страницу

4 ответа

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

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

5
отвечен Ramchandra Apte 2023-01-17 00:31

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

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

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

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

3
отвечен harrymc 2023-01-17 02:48

правильный номер зависит от того, сколько времени процессы тратят на блокировку ввода-вывода.

Книга "программирование параллелизма на JVM" имеет некоторую хорошую информацию об этом:

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

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

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

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

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

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

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

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

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

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

2
отвечен stephenbez 2023-01-17 05:05

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

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

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

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

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

1
отвечен 2023-01-17 07:22

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх