Проблема с Tbb в Intel

Я использую Intel TBB для параллельной обработки некоторых частей алгоритма, обработанного на изображениях. Хотя обработка каждого пикселя зависит от данных, в некоторых случаях 2 последовательных пикселя могут обрабатываться параллельно, как показано ниже.

ProcessImage(image)
for each row in image // Create and wait root task for each line here using allocate_root()
ProcessRow(row)
for each 2 pixel
if(parallel())
ProcessPixel(A) and ProcessPixel(B) in parallel // For testing, create and process 2 tbb::empty_task() here as child tasks
else
ProcessPixel(A)
ProcessPixel(B)

Однако накладные расходы возникают потому, что эта обработка очень быстрая. Для каждого входного изображения (размер 512×512) обработка стоит около 5-6 мс.
Когда я экспериментально использовал Intel TBB в качестве блока комментариев выше, обработка стоила более 25 мс.

Так есть ли лучший способ использовать Intel TBB без лишних затрат или другой более эффективный способ повысить производительность простой и быстрой программы обработки, подобной этой?

1

Решение

TBB не добавляет такие большие (~ 20 мс) накладные расходы для вызова параллельного алгоритма. Я предполагаю (так как не предоставлено никаких подробностей), что это связано с одним из следующих:

  1. Если вы измеряете только первый вызов, он включает накладные расходы на создание рабочих потоков. И обратите внимание, у TBB нет таких барьеров, как OpenMP, поэтому один вызов parallel_for может не хватить для создания всех тем)
  2. Такая же ситуация происходит после того, как рабочие потоки засыпают из-за отсутствия параллельной работы для них. Накладные расходы при пробуждении на несколько порядков меньше, чем при создании потоков, но все же могут повлиять на измерения и сделать неверные выводы.
  3. Планировщик TBB может украсть задачу с внешнего уровня на уровень вложенности (блокирующий вызов), поэтому измерения будут выглядеть так, как будто это займет слишком много времени для обработки только вложенной части, пока он занят дополнительной работой.
  4. Существует конкуренция за обработку (A) и (B) параллельно, вызванную либо явными (например, мьютексом), либо неявными (например, ложным разделением) причинами. Но в любом случае, это не специфично для TBB.

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

И, конечно же, как и советовали, сначала параллельно на внешнем уровне. TBB предоставляет достаточно различных шаблонов для этого, включая tbb::parallel_pipeline а также tbb::flow::graph

2

Другие решения


По вопросам рекламы [email protected]