首页 > 解决方案 > 使用 OpenMP 生成字符串

问题描述

我正在尝试使用 OpenMP生成仅包含 4 个小写英文字母(从aaaato )的所有字符串。zzzz

我的想法是:创建 4 个嵌套循环,每个循环在字符串中生成 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循环时:

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

我只得到了这个结果:

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

标签: copenmp

解决方案


您必须将 a、b、c、d 声明为每个循环的局部变量,而不是全局变量,否则在给定循环上运行的所有 openmp 线程都说循环“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。更多信息: 了解 openmp 中的折叠子句


推荐阅读