c – 如何在OpenMP threadprivate指令中直接初始化对象?


this问题中,其中一个答案引用了OpenMP标准的以下部分:

A threadprivate variable with class type must have:

  • an accessible, unambiguous default constructor in case of default initialization without a given initializer;
  • an accessible, unambiguous constructor accepting the given argument in case of direct initialization;
  • an accessible, unambiguous copy constructor in case of copy initialization with an explicit initializer.

在发布的问题上使用(几乎)相同的示例,我想要做的是:

struct point2d{
        int x;
        int y;
        point2d(){
            x = 0;
            y = 0;
        }
        //copy constructor
        point2d(point2d& p){
            x = p.x;
            y = p.y;
        }
    }; 

并声明point2d类型的两个点变量:

point2d global_point;
point2d local_point(global_point);

#pragma omp threadprivate(local_point)

我看到在发布的问题中使用的示例代码失败,因为OpenMP标准引用部分的第一项(如答案中所指出).

我的问题是,在我的情况下,我如何使用OpenMP标准的第二点来指导初始化私有local_point变量(全部使用global_point)?

此外,它是否有任何意义,或者我完全错过了答案的重点?

最佳答案 由于您链接的帖子中讨论的原因,对于某些编译器,您也不能这样做.我想这就是重点.这是一个缺少的功能,编译器甚至没有尝试隐藏它:

C3057: dynamic initialization of ‘threadprivate’ symbols is not currently supported

你试图实现什么?有了这个简单的结构,你就可以

const int gx = 3;
const int gy = -2;
point2d local_point = {gx, gx+gy};
#pragma omp threadprivate ( local_point )

但你必须坚持const基本类型.如果你想在一个函数内初始化你的threadprivate变量(必须是静态的)你可以使用copyin(它会使用第三项,副本赋值,自然)

void foo()
{
    static point2d local_point;
#pragma omp threadprivate( local_point )
    local_point = global_point;
#pragma omp parallel copyin( local_point )
    { // do something

甚至更好

{
    point2d local_point( global_point );
#pragma omp parallel firstprivate( local_point )
    { // do something

摆脱限制.

点赞