2014-12-06 39 views
1
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编译并运行上面的代码。是的,这非常棒!使用模板类型的OpenMP缩减

但我的问题是在代码评论; “因为结果类型(T)在预处理'#pragma'时未确定,所以编译器如何验证结果类型是否适合于OpenMP压缩?”

我敢肯定,如果T = double和NG,如果T = std :: string,那么确定没问题,但是预处理器如何知道T的类型?

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

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

+0

'#pragma omp'是编译器支持OpenMP的方向,不是预处理器。 – yohjp 2014-12-06 04:13:28

回答

0

未指定(表示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++ ----

+0

谢谢你的回答! – aokomoriuta 2014-12-06 06:18:00