【问题标题】:openmp critical section inside for loopfor循环内的openmp关键部分
【发布时间】:2016-05-31 08:37:25
【问题描述】:

我有以下代码更新 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

抱歉,我有这么多问题,提前谢谢!

【问题讨论】:

  • 语法错误,将{ 换行(critical(updateMaxValue) 之后的行),或完全删除大括号
  • 谢谢,它有效!我不知道 openmp 是这样工作的……

标签: c++ multithreading openmp


【解决方案1】:

但是,我在第二个循环开始时收到了错误:“expected a declaration”。

您有一个语法错误 - 如果存在左大括号,则必须将其移至新行:

#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++)
    {
        // ...
    }
}

【讨论】:

    猜你喜欢
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    • 2014-04-20
    • 2012-05-19
    • 2017-04-26
    • 2019-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多