【发布时间】: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