Мелкозернистая многопоточность - сколько должна выполнять рабочая задача? - PullRequest
2 голосов
/ 26 августа 2009

Я использую шаблон work_pile, поэтому потоки всегда работают и ожидают на семафоре поступающих новых указателей на функции + данные в очереди. Это то, что ребята из яблочного маркетинга теперь называют Grand Central Dispatch и рекламируют как новую нарезанную хлебную массу.

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

Ответы [ 3 ]

1 голос
/ 26 августа 2009

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

1 голос
/ 26 августа 2009

Короткий ответ: вам нужно подумать о ресурсах + нагрузка + бенчмаркинг.

Вот некоторые из способов, которыми вещи могут сломаться:

  1. У вас есть свободные темы? Достаточно ли коротка рабочая нагрузка, чтобы поток выполнялся так долго, что другой поток зависает в ожидании повторного назначения (т. Е. Больше потоков, чем работы)?
  2. Достаточно ли у вас работы? Является ли общая задача выполненной так быстро, что не стоит думать о дополнительных потоках? Помните, что увеличение многопоточности увеличивает накладные расходы на некоторую (иногда) небольшую, но измеримую величину.
  3. Есть ли у вас доступные ресурсы? У вас есть еще темы, чтобы дать? У вас есть циклы процессора, которые бездействуют?

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

1 голос
/ 26 августа 2009

Два возможных ответа:

  • Это зависит.
  • Оцените его.

Я предпочитаю второй.

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

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