Я думаю, что лучший способ ответить на этот вопрос - дать первый обзор того, как потоки управляются системой.В настоящее время все процессоры на самом деле являются многоядерными и многопоточными на ядро, но для простоты давайте сначала представим одноядерный процессор с одним потоком.Это физически ограничено при выполнении только одной задачи за один раз, но мы по-прежнему способны запускать многозадачные программы.
Так как это возможно?Что ж, это просто иллюзия!
Процессор все еще выполняет одну задачу за раз, но переключается между ними, создавая иллюзию многозадачности.Этот процесс перехода от одной задачи к другой называется Переключение контекста .
Во время переключения контекста сохраняются все данные, относящиеся к выполняемой задаче, и данные, относящиеся к следующей.задача загружена.В зависимости от архитектуры процессора данные могут быть сохранены в регистрах, кэш-памяти, оперативной памяти и т. Д. Чем больше технология продвигается, тем более эффективные решения были обнаружены.Когда задача возобновляется, все данные извлекаются, и задача продолжает свои операции.
Эта концепция привносит множество проблем в управление задачами, например:
- Состояние гонки
- Синхронизация
- Голодание
- Тупик
Есть и другие моменты, ноэто лишь краткий список, поскольку вопрос не фокусируется на этом.
Возвращаясь к вашему вопросу:
Если у нас есть необязательный параметр для выбора количества используемых потоков,какое количество потоков лучше всего оптимизирует занятую работу, чтобы она выполнялась максимально быстро?
Будет ли использование 4 потоков в 4 раза быстрее, чем использование 1 потока?Как насчет 15 потоков?50?В какой-то момент я чувствую, что мы будем ограничены аппаратным обеспечением (количеством ядер) в нашем компьютере, и добавление дополнительных потоков перестанет помогать (и может даже мешать?)
Краткий ответ: Это зависит!
Как уже говорилось ранее, для переключения между задачей и другой требуется переключение контекста.Для этого требуются некоторые операции по сохранению и извлечению данных, но эти операции являются лишь накладными расходами для ваших вычислений и не дают вам никаких прямых преимуществ.Таким образом, слишком много задач требует большого количества переключений контекста, а значит, много вычислительного времени тратится впустую!Таким образом, в конце ваша задача может выполняться медленнее, чем с меньшим количеством задач.
Кроме того, поскольку вы пометили этот вопрос с помощью pthreads, также необходимо проверить, что код скомпилирован для работы на нескольких ядрах HW.Наличие многоядерного процессора не гарантирует, что ваш многозадачный код будет работать на нескольких ядрах HW!
В вашем конкретном случае применения:
У меня есть компьютер с 4 ядрами, иУ меня есть программа, которая создает сетку N x M, которая может варьироваться от 1 на 1 квадрат до массивной сетки.Затем программа заполняет его числами и выполняет вычисления для каждого числа, усредняя их все вместе, пока они не достигнут примерно одинакового числа.Целью этого является создание МНОГО занятой работы, так что вычисления с параллельными потоками являются необходимостью.
Является хорошим примером параллельных и независимых от данных вычислений.Такого рода задачи отлично работают на GPU, поскольку операции не имеют корреляции данных, а параллельные вычисления выполняются на аппаратном уровне (современные GPU имеют тысячи вычислительных ядер!)