【问题标题】:Can I use OpenMP reduction when the variable is an array element?当变量是数组元素时,我可以使用 OpenMP 缩减吗?
【发布时间】:2014-11-19 09:26:07
【问题描述】:

OpenMP 手册说

declare reduction 指令中的类型名称不能是函数类型、数组类型、引用类型或用constvolatilerestrict 限定的类型。

如何将结果生成到数组元素中?我开始了:

int main()
{
    // create an input array
    static const int snum = 5000;
    int input[snum];
    for(int i=0; i<snum; ++i){
        input[i] = i+1;
    }

    // shared output variables for reduction
    int sum[2];
    sum[0] = 0;
    sum[1] = 0;

#pragma omp parallel for
#pragma omp declare reduction(+:sum[0])
#pragma omp declare reduction(+:sum[1])
    for(int i=0; i<snum; ++i) {
            int* p = input+i;
            if(i%2==0)
                sum[0] += *p;
            else
                sum[1] += *p;
        }
}

这会导致编译器错误:

27013152.cpp:16:9: error: ‘#pragma’ is not allowed here
 #pragma omp declare reduction(+:sum[0])
         ^~~
27013152.cpp:17:33: error: ‘sum’ does not name a type
 #pragma omp declare reduction(+:sum[1])
                                 ^~~
27013152.cpp:17:36: error: expected ‘:’ before ‘[’ token
 #pragma omp declare reduction(+:sum[1])
                                    ^

【问题讨论】:

  • 你的问题是什么?我不明白。上面的代码不会编译,你不能“这样做”。
  • 你要做什么?你为什么不把你的input 分成两个数组,比如并减少每个数组? (基于奇数或偶数)
  • 其实,我想对表做一个聚合,每列都是一个数组。所以我需要扫描表并进行聚合。但是 Openmp 似乎不支持使用数组减少指令后的名称。那么,如何使用 openmp 并行化我的聚合代码?thx

标签: c++ arrays openmp reduction


【解决方案1】:

您误会了您遇到的错误。这并不意味着您不能减少交替元素。这意味着您不能将其归约为数组的元素。

也就是说,你不能做reduction(+:sum[0])。但是您可以将归约到另一个标量变量中,然后复制到数组的元素中:

void sum_int(const int input[], int num, int *sum)
{
    int sum_even = 0, sum_odd = 0;

    #pragma omp parallel for reduction(+:sum_even) reduction(+:sum_odd)
    for (int i = 0; i < num; i++) {
            if (i % 2 == 0)
                    sum_even += input[i];
            else
                    sum_odd += input[i];
    }

    sum[0] = sum_even;
    sum[1] = sum_odd;
}

【讨论】:

    【解决方案2】:

    从 OpenMP 4.5 开始,现在可以减少 C/C++ 中的数组。 基本上,您必须指定 数组部分(参见第 2.4 节,OpenMP 4.5 规范的第 44 页)。 您的#pragma 规范如下所示:

    #pragma omp parallel reduction(+:sum[:2])
    

    但是要小心,你必须意识到每个线程都会 分配它自己版本的数组部分;如果你这样做大 多线程的数组,你的内存需求会爆炸。

    【讨论】:

      猜你喜欢
      • 2011-04-16
      • 2021-06-17
      • 1970-01-01
      • 2015-09-09
      • 2022-07-26
      • 2012-08-12
      • 2013-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多