Я использую 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 без лишних затрат или другой более эффективный способ повысить производительность простой и быстрой программы обработки, подобной этой?
TBB не добавляет такие большие (~ 20 мс) накладные расходы для вызова параллельного алгоритма. Я предполагаю (так как не предоставлено никаких подробностей), что это связано с одним из следующих:
parallel_for
может не хватить для создания всех тем)Таким образом, совет для измерения производительности с TBB должен учитывать только общее время для достаточно длинной последовательности вычислений, которая будет скрывать издержки инициализации.
И, конечно же, как и советовали, сначала параллельно на внешнем уровне. TBB предоставляет достаточно различных шаблонов для этого, включая tbb::parallel_pipeline
а также tbb::flow::graph