【问题标题】:OpenMP SIMD reduction in array: "error: reduction variable must be shared on entry to this OpenMP pragma"数组中的 OpenMP SIMD 缩减:“错误:缩减变量必须在进入此 OpenMP 杂注时共享”
【发布时间】:2021-06-17 02:55:00
【问题描述】:

我正在尝试计算矩阵中相邻元素的平均值,但无法让 OpenMP 的矢量化工作。据我了解,第二个嵌套 for 循环,reduction 子句应确保在写入next 的元素时不会发生竞争条件。但是,在编译代码时(我尝试使用 GCC GCC 7.3.0 和 ICC 以及 OpenMP > 4.5 进行自动矢量化)我得到报告:“错误:在进入此 OpenMP 杂注时必须共享缩减变量“next””。为什么默认共享变量时会出现这种情况?由于添加 shared(next) 似乎没有帮助,我该如何解决此问题?

// CODE ABOVE (...)
size_t const width = 100;
size_t const height = 100;
float * restrict next = malloc(sizeof(float)*width*height);

// INITIALIZATION OF 'next' (this works fine)
#pragma omp for simd collapse(2) 
  for(size_t j = 1; j < height-1; j++)
    for(size_t i = 1; i < width-1; i++)
      next[j*width+i] = 0.0f; 

// COMPUTE AVERAGE FOR INNER ELEMENTS
#pragma omp for simd collapse(4) reduction(+:next[0:width*height]) 
for(size_t j = 1; j < height-1; ++j){
  for(size_t i = 1; i < width-1; ++i){
    // compute average over adjacent elements
    for(size_t _j = 0; _j < 3; _j++) {
      for(size_t _i = 0; _i < 3; _i++) {
          next[j*width + i] += (1.0 / 9.0) * next[(j-1 +_j)*width + (i-1 + _i)]; 
      }
    }
  }
}

【问题讨论】:

    标签: c multithreading parallel-processing openmp simd


    【解决方案1】:

    问题是GCC 7.3.0不支持

    #pragma omp for simd collapse(4) reduction(+:next[0:width*height]) 
    

    在此上下文中使用数组部分的reduction

    此功能由GCC 9转发支持:

    从 GCC 9 开始,有最初的 OpenMP 5 支持(主要是 C/C++, 只要)。 GCC 10 添加了更多功能,主要针对 C/C++,但也针对 Fortran。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-11
      • 2016-05-12
      • 1970-01-01
      • 2015-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多