OpenMP - Использование критической секции внутри двух для циклов - PullRequest
0 голосов
/ 04 мая 2018

Я пытаюсь использовать OpenMP 2.0 для 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 конструкции, у меня есть скомпилированный код.

1 Ответ

0 голосов
/ 04 мая 2018

Ваш код имеет несколько проблем:

  1. return не допускается внутри #pragma omp for.
  2. вложенные #pragma omp for разрешены, только если вы открываете новый параллельный регион
  3. result, ch, ascii, red, green, blue являются общими переменными, вы должны учитывать это

В отличие от того, что вы заявляете: if операторы разрешены внутри #pragma omp for. Проблема только с return, break.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...