OpenMP模板类型的缩减

3
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 reduction?” 我确定当T = double时,它是可以的,而当T = std :: string时,它是不可行的,但是预处理器如何知道T的类型?我记得很久以前我无法使用某些小型C ++编译器编译上述代码。让我问一下,在C ++ / OpenMP规范的背景下,哪种行为(可编译或不可编译)是正确的。

1
#pragma omp 是用于编译器支持OpenMP的指令,而不是预处理器。 - yohjp
1个回答

1

对于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++ ----


这真的适用于此吗?程序中难道没有对变量的其他引用吗,比如 result += a[i]; 这里的引用? - Zulan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接