formp中的openmp临界区

时间:2016-05-31 08:37:26

标签: c++ multithreading openmp

我有以下代码更新for循环中的内容,其后有另一个for循环。但是,我收到了错误:"预计会发出声明"在第二个循环的开头。问题似乎出现在"关键"部分,因为如果我删除它,错误将消失。我是openMP的新手,我在这里关注一个例子:http://www.viva64.com/en/a/0054/#ID0EBUEM(参考" 5.关键部分的条目太多")。有谁知道我在这里做错了什么?

此外,"如果在临界区之前执行比较,那么在循环的所有迭代期间都不会输入临界区"?

另一件事是我实际上想要同时并行化两个循环,但由于循环内的操作不同,我在这里使用两个线程团队,希望如果第一个中不需要线程循环,他们可以立即开始执行第二个循环。这有用吗?

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

很抱歉,我有很多问题,并提前致谢!

1 个答案:

答案 0 :(得分:0)

  

然而,我收到了错误:&#34;预计会发出声明&#34;在第二个循环的开头。

您有语法错误 - 必须将左括号(如果存在)移动到新行:

#pragma omp critical(updateMaxValue){
//                                 ~^~

应更改为:

#pragma omp critical(updateMaxValue)
{

(实际上你并不需要它,因为后面的if语句是结构化块)。

  

另一件事是我实际上想要同时并行化两个循环,但由于循环内部的操作不同,我在这里使用两个线程团队,希望如果有不需要的线程在第一个循环中,它们可以立即开始执行第二个循环。

使用单个并行区域,然后在第一个for循环中使用nowait子句:

#pragma omp parallel
{
    #pragma omp for schedule(dynamic) nowait
    //                                ~~~~~^
    for (int i = 0; i < n; i++)
    {
        // ...
    }

    #pragma omp for schedule(dynamic)
    for (int i = 0; i < m; i++)
    {
        // ...
    }
}