首页 > 解决方案 > OpenMP - 在两个 for 循环中使用临界区

问题描述

我正在尝试使用OpenMP 2.0for parallel for2 个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构造的代码,我有一个编译的代码。

标签: c++openmp

解决方案


您的代码有多个问题:

  1. return不允许在#pragma omp for.
  2. #pragma omp for仅当您打开一个新的并行区域时才允许嵌套
  3. result, ch, ascii, red, green, blue是共享变量,你必须考虑到这一点

与您所说的相反:if内部允许声明#pragma omp for。问题仅在于return, break.


推荐阅读