В моей программе мне нужно разделить n потоков следующим образом:
1) Thread1 выполняет свою конкретную работу
2) n-1 другие потоки выполняют свою работу
Если number_of _threads == 1, то выполняется только действие 1).
Действия 1) и 2) вычисляются параллельно
void main(){
int number_of_threads;
std::cin>>number_of_threads;
omp_set_num_threads(number_of_threads);
#pragma omp parallel if (number_of_threads>1)
{
#pragma omp master // no barrier at the end of master block
single_calc();
#pragma omp ??(number_of_threads-1) //second block
// this section of code is computed by n-1 processes
}
}
Я пришел к следующим решениям
1) hardcode, чтобы поток с id == 1 не делал 't вычислить второй блок
2) поскольку главный поток имеет id = 0, я могу использовать #pragma omp for
, начиная с i = 1 во втором блоке
3) вызывать single_calc () снаружи#pragma omp parallel
(но я хочу контролировать количество потоков, вычисляющих этот блок)
Есть ли какое-нибудь элегантное решение для этого?