У меня есть часть кода с двумя вложенными циклами. Когда у первого есть несколько шагов, у второго есть много, а наоборот. Я могу запускать оба цикла с omp для директив самостоятельно, и у меня есть последовательные результаты (и некоторое ускорение). Однако я хотел бы:Openmp scheduling
- Запустить первый один параллельно, если он имеет 16 шагов или больше
- Else запустить второй параллельно (но не первый, даже если он имеет 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, и я не уверен, что компилятор целевого оборудования будет поддерживать это.
Любые идеи?
Привет и спасибо. На самом деле я закончил писать две разные параллельные области внутри if() {} else {}, как вы сказали. Это уродливо, но это довольно эффективно. Я попробую ваше решение, когда я буду искать что-то элегантное. – Emilien