0

I'm trying to generate all the strings which contain only 4 lowercase English letters (from aaaa to zzzz) using OpenMP.

My idea is: create 4 nested loops, each loop generates 1 letter in the string.

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);
            }
        }
    }
}

The problem is, when I used OpenMP to parallelize the for loop:

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 got only this result:

aaam
aaan
aaao
aaap
aaae
aaaf
aaag
aaah
aaai
aaaj
aaak
aaal
aaaa
aaab
aaac
aaad
Minh Dao
  • 827
  • 8
  • 21

1 Answers1

0

You must declare a,b,c,d as local variable of each loop and not globals otherwise all of the openmp threads running on a given loop say loop "a" will overwrite "a" value.

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);
            }
        }
    }
}

I almost sure you cannot use collaspe in this specific case. More infos here: Understanding the collapse clause in openmp

Jean-Marc Volle
  • 3,113
  • 1
  • 16
  • 20
  • Thank you very much. Your `collapse` reference is very useful. And a minor thing in your code: `#pragma omp parallel` should become `#pragma omp parallel for` in oder to make the code print all `26^4` cases. – Minh Dao Apr 16 '20 at 04:09