2014-12-06 38 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