使用模板类型减少OpenMP

时间:2014-12-06 03:48:25

标签: c++ openmp

template <typename T, std::size_t N>
static T sum(const std::array<T, N>& a)
{
    T result;

    // type of result (T) is not determined when pre-process?
    #pragma omp parallel for reduction(+: result)
    for(int i = 0; i < static_cast<int>(N); i++)
    {
        result += a[i];
    }
    return result;
}

我可以使用MSVC和gcc编译并运行上面的代码。是的,它很棒!

但我的问题在于代码评论; &#34;由于在预处理&#p; #pragma&#39;时未确定结果类型(T),编译器如何验证结果类型是否适合OpenMP减少?&# 34;

如果T = double,我确定没关系,如果T = std :: string则确定NG,但预处理器如何知道T的类型?

我记得很久以前我无法用一些小的c ++编译器编译上面的代码。

让我问一下在C ++ / OpenMP规范的上下文中哪些行为(可编译或不可编译)是正确的。

1 个答案:

答案 0 :(得分:1)

未指定(对于OpenMP 3.0或更高版本)或未定义(对于OpenMP 2.5)

reduction是数据共享属性子句之一,OpenMP Application Program Interface Version 2.5说:

  

2.8.3数据共享属性条款
  ---- C / C ++ ----
  如果数据共享属性子句中引用的变量具有从模板派生的类型,并且程序中没有对该变量的其他引用,则与该变量相关的任何行为都是未定义的。
  ---- C / C ++ ----

OpenMP Application Program Interface Version 3.0说:

  

2.9.3数据共享属性条款
  ---- C / C ++ ----
  如果数据共享属性子句中引用的变量具有从模板派生的类型,并且程序中没有对该变量的其他引用,则未指定与该变量相关的任何行为。
  ---- C / C ++ ----

相关问题