Как я могу сделать так, чтобы потоки продолжали и запускали другую функцию - C ++ с OpenMP? - PullRequest
0 голосов
/ 29 сентября 2019

У меня есть опыт работы с параллельными циклами и секциями с OpenMP в C ++, но теперь мне нужно заставить потоки идти вперед и запускать функцию, пока один поток продолжает выполнять форнер-функцию

Функция table_builder_1 создает матрицуи после завершения работы всех потоков только один поток начинает записывать матрицу в файл (в настоящее время все остальные потоки ожидают его).

1. Как сделать так, чтобы потоки продолжили и запустили функцию table_builder_2?
2. После завершения потока писателя он присоединится к другим?

int main{

Class foo

foo.table_builder_1;
foo.table_builder_2;


return 0;
}



void foo:table_builder_1{

#pragma omp parallel for schedule(dynamic)
    for (int i = 0; i < N_size; i++){
      for (int j = 0; j < N_size; j++) {
         create table
    }
}

\\write the table in file: 
file.write (Table) 


return;
}

Примечание: 1. Я не могу распараллелить запись, потому что данные должны быть упорядочены. 2. Функция table_builder_2 делает то же самое, что table_builder_1

1 Ответ

0 голосов
/ 30 сентября 2019

Это звучит как хороший случай для #pragma omp single nowait.

#pragma omp single указывает, что часть кода должна выполняться одним потоком (не обязательно основным потоком) (из этого ответа. )

Предложение nowait не позволяет другим потокам ожидать поток, который пишет.

...