打开环路内部的关键部分
openmp critical section inside for loop
我有以下代码,它更新了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
对不起,我有这么多问题,提前谢谢!
然而,我在第二个循环的开头得到了错误:"预期有一个声明">
您有语法错误-左大括号(如果存在)必须移动到新行:
#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++)
{
// ...
}
}
相关文章:
- 将函数类成员映射到类本身内部
- 使用一个考虑到std::map中键值的滚动或换行的键
- 如何在c++中只将键插入到bimap的一侧
- 使用2个键的cpp-stl::优先级队列排序不正确
- Boost Spirit,获取迭代器内部语义动作
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 内联函数中具有内部链接的全局变量
- 在函数内部的声明中初始化数组,并在外部使用它
- 如何在不知道向量大小的情况下输入向量内部的向量?
- 有效地使用std::unordered_map来插入或增加键的值
- 卷曲bracers内部结构的声明
- 从函数角度看ID到文件路径的内部与外部映射
- C++映射有2个键,这样任何1个键都可以用来获取值
- spdlog标头仅与外部fmt一起使用.spdlog错误:'内部':不是'fmt'
- 如何在pugixml中获取节点的内部XML
- 使用C链接在函数内部创建C++模板
- 智能指针作为无序映射键,并通过引用进行比较
- 带有数组键C++的二进制映射
- 电子内部或外部方法创建自己的右键单击上下文菜单 - Windows
- 多重映射如何在内部处理重复键