У меня есть набор данных, который я хотел бы использовать с 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
Причиной такого поведения является то, что простой разделитель разбивает ваш диапазон по следующим критериям:
CEIL (размеров зерен / 2) <= размер <= размер зерна
при использовании с tbb::blocked_range(i, j, grainsize)
и chunksize — это размер вашего диапазона.
Вы можете проверить Руководство для получения дополнительной информации в разделе 3.2.5 Сводка по разделам.
Нет простого способа получить фиксированный размер в TBB (вы можете легко добиться этого с помощью OpenMP). Это потому, что это противоречит понятиям TBB. TBB пытается отвлечь все эти вещи от вас, а планировщик гарантирует, что ваши потоки будут использоваться наилучшим образом во время выполнения.
Других решений пока нет …