ТББ Параллельный трубопровод, кажется, работает в порядке? - PullRequest
0 голосов
/ 24 апреля 2020

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

Я придумал следующий пример:

int start = 0;
tbb::parallel_pipeline(16,
    tbb::make_filter<void, int>(tbb::filter::serial_out_of_order, [&](tbb::flow_control& fc){
        if(start < 1000) {
            return start++;
        }
        fc.stop();
        return start;
    }) &
    tbb::make_filter<int, int>(tbb::filter::parallel, [](int num){
        std::cout << num << std::endl;
        return num + 1;
    }) &
    tbb::make_filter<int, void>(tbb::filter::parallel, [](int num){
    })
);

Когда этот код выполняется, 1-1000 печатается последовательно. Это правильное поведение? Или у меня проблема с окружением?

1 Ответ

1 голос
/ 24 апреля 2020

Переупорядочение довольно маловероятно на практике при запуске второго фильтра.

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

Чтобы повысить шансы наблюдать за выполнением не по порядку, переместите операторы печати в третий фильтр и добавьте случайное количество «работа» ко второму, так что время для обработки предмета меняется.

...