У меня есть следующий код, который обновляет что-то внутри цикла for, а другой - для цикла, следующего за ним. Тем не менее, я получил ошибку: «ожидается объявление» в начале второго цикла. Проблема, кажется, в «критической» части, потому что, если я ее удалю, ошибка исчезнет. Я новичок в openMP, и здесь я приведу пример: http://www.viva64.com/en/a/0054/#ID0EBUEM (см. «5. Слишком много записей в критические разделы»). Кто-нибудь знает, что я здесь делаю неправильно?критический раздел openmp внутри цикла
Кроме того, верно ли, что «если сравнение выполняется до критической секции, критическая секция не будет введена во время всех итераций цикла»?
Другое дело, что я на самом деле хочу параллельно распараллеливать две петли, но поскольку операции внутри циклов различны, я использую здесь две команды потоков, надеясь, что если есть потоки, которые не нужны в первый цикл, они могут сразу начать выполнение второго цикла. Будет ли это работать?
double maxValue = 0.0;
#pragma omp parallel for schedule (dynamic) //first loop
for (int i = 0; i < n; i++){
if (some condition satisfied)
{
#pragma omp atomic
count++;
continue;
}
double tmp = getValue(i);
#pragma omp flush(maxValue)
if (tmp > maxValue){
#pragma omp critical(updateMaxValue){
if (tmp > maxValue){
maxValue = tmp;
//update some other variables
...
}
}
}
}
#pragma omp parallel for schedule (dynamic) //second loop
for (int i = 0; i < m; i++){
//some operations...
}
#pragma omp barrier
Извините, что у меня так много вопросов и спасибо заранее!
У вас есть ошибка синтаксиса, положить, что '{ 'в новой строке (тот, который приходит после 'критического (updateMaxValue)'), или удаляет брекеты вообще –
Спасибо, это работает! Я не знал, что openmp работает таким образом ... – pumpkinjuice