У меня есть фрагмент кода с двумя вложенными циклами for. Когда у первого несколько шагов, у второго много, и наоборот. Я могу запускать оба цикла for с помощью директив omp for независимо, и у меня стабильные результаты (и некоторое ускорение). Однако я бы хотел:
- Параллельно запускайте первую, если в ней 16 и более шагов.
- В противном случае запустите второй параллельно (но не первый, даже если он имеет 8 шагов)
Это не вложенный параллелизм, потому что либо один цикл параллелен, либо другой. Если я запускаю их независимо и запускаю top -H, чтобы увидеть потоки, я иногда наблюдаю только один поток, иногда больше (в каждом случае), поэтому то, что я хочу сделать, имело бы смысл и действительно улучшило бы производительность?
Пока я делал что-то вроде этого:
#pragma omp parallel
{
#pragma omp for schedule(static,16)
for(...){
/* some declarations */
#pragma omp for schedule(static,16) nowait
for(...){
/* ... */
}
}
}
который не компилируется (область совместной работы не может быть тесно вложена в область совместной работы, критическую, упорядоченную, главную или явную область задач) и которая в любом случае не будет вести себя так, как я описал. Я также пробовал свернуть, но у меня были проблемы с "/ * некоторыми объявлениями * /", и я бы хотел избежать этого, так как это openmp3.0, и я не уверен, что компилятор целевого оборудования будет поддерживать это.
Любые идеи?