使用模板类型减少 OpenMP

OpenMP reduction with template type

本文关键字:OpenMP 类型      更新时间:2023-10-16
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 编译和运行上面的代码。是的,非常棒!

但我的问题在代码注释中;"由于结果类型 (T( 不是在预处理'#pragma'时确定的,因此编译器如何验证结果类型是否适合 OpenMP 缩减?

我确定如果 T=double,如果 T=std::string 是可以的,但是预处理器如何知道 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++ ----