簡體   English   中英

使用模板類型減少OpenMP

[英]OpenMP reduction with template type

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編譯並運行上面的代碼。 是的,這太棒了!

但我的問題是在代碼評論中; “因為在預處理'#pragma'時沒有確定結果類型(T),編譯器如何驗證結果類型是否適合OpenMP減少?”

我確定如果T = double,那就沒關系,如果T = std :: string則是NG,但是預處理器如何知道T的類型?

我記得很久以前我用一些小的c ++編譯器無法編譯上面的代碼。

讓我問一下在C ++ / OpenMP規范的上下文中哪種行為(可編譯或不可編譯)是正確的。

未指定 (對於OpenMP 3.0或更高版本)或未定義 (對於OpenMP 2.5)

reduction是數據共享屬性子句之一, OpenMP應用程序接口版本2.5說:

2.8.3數據共享屬性子句
---- C / C ++ ----
如果數據共享屬性子句中引用的變量具有從模板派生的類型,並且程序中沒有對該變量的其他引用,則與該變量相關的任何行為都是未定義的。
---- C / C ++ ----

OpenMP應用程序接口版本3.0說:

2.9.3數據共享屬性子句
---- C / C ++ ----
如果數據共享屬性子句中引用的變量具有從模板派生的類型,並且程序中沒有對該變量的其他引用,則未指定與該變量相關的任何行為。
---- C / C ++ ----

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM