Я пытаюсь использовать Intel TBB для распараллеливания внутреннего цикла (2-й из 3-х), однако, я получаю достойную отдачу только тогда, когда внутренние 2 цикла имеют значительный размер.
Является ли 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 (который я пытаюсь удалить !!!) такой проблемы нет.
IЯ собираю с:
intel ICC 12.1 в -03 -xHost -mavx
На Intel 2500k (4 ядра)
РЕДАКТИРОВАТЬ: я действительно могу изменить порядок цикловпотому что тест выходных циклов необходимо заменить на предикат, основанный на результате циклов.