TBB vs. Homegrown Workqueue - PullRequest
       24

TBB vs. Homegrown Workqueue

2 голосов
/ 11 ноября 2011

Я знаю, TBB (Thread Building Blocks) утверждает, что имеет сложный движок, но с алгоритмической точки зрения:

Если бы у нас была (скажем, в Linux) рабочая очередь с N рабочими потоками (потоки POSIX, N - это число ядер) и синхронизированной с мьютексами очередью задач, то каждый рабочий поток затем выполнял задачу из очереди в режиме ожидания также некоторые вызовы синхронизации, что еще может предложить TBB, не считая хорошего синтаксиса C++? Я не вижу лучшего алгоритма, чем жадное распределение задач между ядрами.

Ответы [ 2 ]

15 голосов
/ 11 ноября 2011

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

  • Не пишите свой собственный планировщик (и здесь рассчитывается рабочая очередь).
  • Вы либо сделаете это неэффективно, либо ошибетесь.

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

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

  • написание огромных , запутанных тестовых случаев (просто для выявления случайного сбоя, который произошел только в <1% прогонов), </li>
  • тратя часы подряд просто глядя на код, пытаясь выяснить ошибку, применяя логику
  • отслеживание каждой отдельной строки в отладчике (которая может произойти сбой без трассировки стека при возникновении ошибки), отслеживание состояния всех переменных в всех потоков вручную, чтобы быть убедитесь, что фактическое состояние программы соответствует ожидаемому состоянию
  • сокращение кода в несколько раз, по существу, до нуля и перестройка, комментирование отдельных строк или пар строк, чтобы увидеть эффект ( огромное комбинаторное пространство), и
  • бегом к стенам, головой вперед.
3 голосов
/ 11 ноября 2011

Не зная точной реализации TBB, я не могу сказать, что именно он предлагает, но, поскольку вы сказали, «что может это предложить» ...

Среди прочих

  • Он может предлагать блокировку и снятие очереди без блокировки вместо одного системного вызова и переключения контекста на задачу. Это сложнее реализовать, чем кажется.
  • Кроме того, он может предлагать блокировку рабочих потоков, если очередь пуста. Это снова сложнее реализовать, чем кажется.
  • Может предложить кражу работы.
  • Он может предлагать назначение задач LIFO потокам таким же образом, как работают порты завершения Windows (повышая эффективность кэширования).
  • Это может быть без ошибок. Это опять-таки сложнее реализовать, чем вы думаете.
...