c++ - OpenMP - 在两个 for 循环中使用临界区
问题描述
我正在尝试使用OpenMP 2.0
for parallel for
2 个for
循环。我找到了一些示例,我如何使用parallel for
并选择了一些变体。
这就是为什么我试图遵循这种方式:
#pragma omp parallel
for(int i=1; i<n; i++) {
#pragma omp for nowait
for(int j=0; j<n; j++) {
//some code here..
}
}
好的。但我是新手,OpenMP world
我明白如果我有一些结构,比如:if {...}
,我需要找到另一个变体来并行化我的循环,并考虑到我的if constructions
.
你能帮我找到一个正确的方法来并行化我的函数OpenMP
吗?谢谢你。
string readTextFromImage(Mat image) {
string result = "";
int red;
int green;
int blue;
int ascii;
char ch;
#pragma omp parallel for
for (int i = 0; i < 100; i++)
{
#pragma omp for nowait
for (int j = 0; j < 100; j++)
{
if (i == 0 && j < 3)
{
continue;
}
red = (image.at<Vec3b>(i, j)[2] + 1 - 1) % 10;
green = (image.at<Vec3b>(i, j)[1] + 1 - 1) % 10;
blue = (image.at<Vec3b>(i, j)[0] + 1 - 1) % 10;
if (red == 0 && green == 0 && blue == 0)
{
return result;
}
ascii = red * 100 + green * 10 + blue;
ch = ascii;
result += ch;
}
}
return result;
}
作为我使用上面代码的结果。我有一个错误,我的代码甚至无法编译:
C1001 编译器发生内部错误。
但是如果我使用没有if
构造的代码,我有一个编译的代码。
解决方案
您的代码有多个问题:
return
不允许在#pragma omp for
.#pragma omp for
仅当您打开一个新的并行区域时才允许嵌套result, ch, ascii, red, green, blue
是共享变量,你必须考虑到这一点
与您所说的相反:if
内部允许声明#pragma omp for
。问题仅在于return, break
.
推荐阅读
- c# - 将两个字符串与 C# 中的一个值进行比较
- .net - Visual Studio 2019 .NET VB Web 应用程序如何将查询结果显示到 ViewGrid?
- java - 使用 Jena 使用自定义函数 SPARQL 查询 GraphDB 的存储库
- swift - 使用 Swift 实现部分弧线的内阴影
- c++ - 从其他参数派生模板参数,但保持智能
- shrink - 将 lvm 分区从大磁盘移动到小磁盘
- azure - 有没有办法使用 ARM 模板来创建 Azure 服务主体?
- javascript - Javascript异步函数返回then-catch承诺?
- cassandra - Cassandra 高可用性
- c++ - 对取消引用的 NULL 指针的引用是否会在 C++ 中创建或访问时产生 UB