4 августа 2019 г. Ёсио Ямаути (@spparkle1017)

При использовании функций opencv как в python, так и в c++ я заметил, что задачи автоматически распределялись по всем ядрам. Я подумал, что это может быть связано с тем, что opencv использует некоторые алгоритмы распределения задач и фон потоков. Это было правдой, и это называется Intel Thread Building Block, или TBB.

TBB использует цикл for или while и разбивает их на небольшие фрагменты задач, автоматически распределяя их по доступным ядрам. Он решает, какие ядра использовать, и, если одно ядро ​​занято больше других, перекладывает задачи, выделенные для занятого ядра, на другое.

Эта концепция называется параллелизм на основе задач. С помощью Intel TBB нам больше не нужно заботиться об отдельных потоках и их распределении, потому что все эти скучные задачи выполняются автоматически.

Вот пример фрагмента кода:

#include "tbb/tbb.h"
using namespace tbb;
float Foo(float x){ return 3.14 * x; } // the function we want to apply on arr in parallel
int main()
{
  int grain_size = 100; // the size of subrange
  int size = 20000;
  float arr[size];
  parallel_for(blocked_range<size_t>(0, size, grain_size),   ApplyFoo(arr));
  return 0;
}

Допустим, мы хотим применить функцию Foo() ко всем элементам массива arr. Поскольку этот тип бивня легко распараллеливается, мы можем ожидать некоторого прироста скорости за счет использования потоков. Это как раз то, что делает parallel_for().

Первый аргумент prallel_for() — это диапазон индекса и размер зерна. Размер зернистости определяет, на какие мелкие части он делит задачу. Меньший размер зерна означает большее количество фрагментов задачи.

ApplyFoo — это класс, определяющий, какая операция выполняется над arr;

class ApplyFoo
{
   float* arr_copy;
public:
   void operator()(const blocked_range<size_t>& r) const {
     float *arr = a_copy;
     for(size_t i=r.begin(); i!=r.end(); ++i)
     {
       arr[i] = Foo(arr[i]); // here’s the task to do in parallel
     }
   }
   // constructor
   ApplyFoo(float* a):
     arr_copy(arr)
   {}
};

Вот официальные документы:

https://software.intel.com/sites/default/files/m/d/4/1/d/8/tutorial.pdf