Статическое разбиение tbb::rallel_for

У меня есть набор данных, который я хотел бы использовать с tbb::parallel_for в интервалах размера interval_size, Каждый интервал, который потребляет мой функтор, должен быть interval_sizeза исключением последнего неполного интервала, который может быть меньше, когда interval_size не делит равномерно мой набор данных.

Есть ли способ использовать TBB для статического разбиения таким образом? Этот тест дает несколько интервалов меньше, чем interval_size в моей системе:

#include <tbb/parallel_for.h>
#include <iostream>

struct body
{
  void operator()(const tbb::blocked_range<size_t> &r) const
  {
    std::cout << "range size: " << r.end() - r.begin() << std::endl;
  }
};

int main()
{
  size_t num_intervals = 4;
  size_t interval_size = 3;

  // consume num_intervals plus a partial interval in total
  size_t n = num_intervals * interval_size + (interval_size - 1);
  tbb::parallel_for(tbb::blocked_range<size_t>(0, n, interval_size),
                    body(),
                    tbb::simple_partitioner());

  return 0;
}

Выход:

$ g++ test_parallel_for.cpp -ltbb
$ ./a.out 
range size: 3
range size: 2
range size: 2
range size: 3
range size: 2
range size: 2

1 ответ

Решение

Причина такого поведения заключается в том, что простой секционер разделяет ваш диапазон по следующим критериям:

ceil (размер зерна /2) <= размер кусочка <= размер зерна

при использовании с tbb::blocked_range(i, j, grainsize) и chunksize - это размер вашего диапазона.

Вы можете проверить Учебное пособие для получения дополнительной информации в 3.2.5 Сводка по разделам.

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

Другие вопросы по тегам