Как и во всем в HPC, ответ «Это зависит ...»
Здесь это будет зависеть от
- Насколько велика ваша машина и насколько большие "bSize" и "N"
- Каково содержимое внутреннего цикла
Для статического планирования итераций, которые все выполняются за одно и то же время, если только вы не можете гарантировать, что количество итераций, распределяемых по работе, делится на количество потоков, вам необходимо убедиться, что количество доступных итераций составляет ~ 10x количество потоков гарантирует 90% эффективности из-за потенциального дисбаланса. Поэтому, если у вас 16-ядерная машина, вы хотите> 160 итераций. Если «bSize» невелик, то использование коллапса для создания более доступного параллелизма поможет повысить производительность (В худшем случае представьте, что «bSize» меньше, чем количество потоков!)
С другой стороны, как указывает @ tim18, если вы можете векторизовать внутренний цикл, сохраняя при этом достаточный параллелизм, что может быть лучше.
С третьей стороны, ничто не мешает вам сделать то и другое: -
#pragma omp for simd collapse(2)
for(int b=0; b<bSize; b++)
for(int n=0; n<N; n++) o[n + b*N] = b[n];
Если ваш внутренний цикл действительно такой маленький (и векторизуемый), то вы, безусловно, захотите его векторизовать, поскольку, в отличие от параллелизма, векторизация может сократить общее используемое вами время ЦП, а не просто перемещать его между ядрами.