C++ OpenMP-在两个for循环中使用关键部分

C++ OpenMP-在两个for循环中使用关键部分,c++,openmp,C++,Openmp,我正在尝试将OpenMP 2.0用于并行for 2 for循环。我已经找到了一些示例,以及如何使用并行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 2.0用于并行for 2 for循环。我已经找到了一些示例,以及如何使用并行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..
    }
}
正如我使用上述代码得到的结果。我有一个错误,我的代码甚至无法编译:

C1001编译器中发生内部错误


但是,如果我使用没有if构造的代码,我会编译代码。

您的代码有多个问题:

不允许在的pragma omp内返回。 仅当打开新的并行区域时,才允许嵌套pragma omp for 结果,ch,ascii,红色,绿色,蓝色是共享变量,你必须考虑到这一点
与您声明的相反:在pragma omp for中允许使用if语句。问题只在于返回、中断。

我不理解这个问题。您的代码有一些pragma omp并行。它不是如预期的那样工作吗?你能详细说明一下吗?如果我有一些想法,比如:?另外,如果您能提供,那就太好了,它可以让您更轻松地具体演示如何正确执行此操作。@user463035818不,它不起作用。我猜,这是因为没有使用临界截面。因为我在测试它时没有考虑到它是否正常。当然,我需要这些条件。我正在试图找到一种方法,如何正确地进行并行化。请在确保是您发布的代码导致了错误之后,逐字地将错误添加到问题中。似乎还没有人提到这一点:编译器中出现了一条消息,如C1001内部错误。是编译器错误的证据。有时,编译器错误会被一个试图做一些不同寻常的事情的程序暴露出来,它是如此的“错误”,以至于编译器编写人员以前从未遇到过它,或者预期永远不会发生,所以没有任何准备。至于OP的代码,人们要求的很多都是有用的。
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;
}