Я пытаюсь использовать Intel TBB для параллелизации внутреннего цикла (2 из 3), однако, я получаю приличную компенсацию, когда внутренние 2 цикла имеют значительный размер.Оптимизация внутреннего цикла C++ intel TBB
Является ли TBB новыми нитями для каждой итерации основной петли? Есть ли способ уменьшить накладные расходы?
tbb::task_scheduler_init tbb_init(4); //I have 4 cores
tbb::blocked_range<size_t> blk_rng(0, crs_.y_sz, crs_.y_sz/4);
boost::chrono::system_clock::time_point start =boost::chrono::system_clock::now();
for(unsigned i=0; i!=5000; ++i)
{
tbb::parallel_for(blk_rng,
[&](const tbb::blocked_range<size_t>& br)->void
{
:::
Возможно, было бы интересно отметить, что openMP (который я пытаюсь удалить !!!) не имеет этой проблемы.
Я компиляции с:
Intel ICC 12,1 при -03 -xHost -mavx
На интел 2500K (4 ядра)
EDIT: Я действительно может изменить порядок петель, потому что тест out loops необходимо заменить предикатом, основанным на результатах циклов.
Похоже, вы просите, чтобы он произвел параллельную работу 5000 раз, это точно? – user7116
@sixlettervariables да, я получаю большие выгоды от openMP, я хочу знать, могу ли я реплицировать такие выигрыши с помощью TBB – 111111
попробуйте использовать разделители в tbb, особенно affinity_partiioner, если вы этого не сделали. Фиксированное разделение OpenMP действительно хорошо подходит для небольших внутренних циклов из-за политик, применяемых к командам потоков ... – Rick