Генерация строк с использованием OpenMP - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь сгенерировать все строки, которые содержат только 4 строчных буквы Engli sh (от aaaa до zzzz), используя OpenMP.

Моя идея такова: создать 4 вложенных цикла, каждый l oop генерирует 1 букву в строке.

char a, b, c, d, start = 'a', end = 'z';

for (a = start; a <= end; a++)
{
    for (b = start; b <= end; b++)
    {
        for (c = start; c <= end; c++)
        {
            for (d = start; d <= end; d++)
            {
                printf("%c%c%c%c\n", a, b, c, d);
            }
        }
    }
}

Проблема в том, что когда я использовал OpenMP для распараллеливания for l oop:

char a, b, c, d, start = 'a', end = 'z';

#pragma omp parallel for collapse(4)
for (a = start; a <= end; a++)
{
    for (b = start; b <= end; b++)
    {
        for (c = start; c <= end; c++)
        {
            for (d = start; d <= end; d++)
            {
                printf("%c%c%c%c\n", a, b, c, d);
            }
        }
    }
}

I получил только этот результат:

aaam
aaan
aaao
aaap
aaae
aaaf
aaag
aaah
aaai
aaaj
aaak
aaal
aaaa
aaab
aaac
aaad

1 Ответ

0 голосов
/ 13 апреля 2020

Вы должны объявить a, b, c, d как локальную переменную каждого l oop, а не глобальные переменные, в противном случае все потоки openmp, работающие на данном l oop скажем, l oop "a" будут переписать значение «a».

char start = 'a', end = 'z';

#pragma omp parallel for
for (char a = start; a <= end; a++)
{
    for (char b = start; b <= end; b++)
    {
        for (char c = start; c <= end; c++)
        {
            for (char d = start; d <= end; d++)
            {
                printf("%c%c%c%c\n", a, b, c, d);
            }
        }
    }
}

Я почти уверен, что вы не можете использовать collaspe в этом конкретном случае c. Больше информации здесь: Понимание условия свертывания в openmp

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