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

时间:2016-03-01 20:20:59

标签: c++ openmp

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

  

具有类类型的threadprivate变量必须具有:

     
      
  • 在没有给定初始值设定项的默认初始化的情况下,一个可访问的,明确的默认构造函数;
  •   
  • 一个可访问的,明确的构造函数,在直接初始化时接受给定的参数;
  •   
  • 在使用显式初始化程序进行复制初始化时,可访问的,明确的复制构造函数。
  •   

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

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

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

point2d global_point;
point2d local_point(global_point);

#pragma omp threadprivate(local_point)

我看到在发布的问题中使用的示例代码由于OpenMP标准引用部分的第一项而失败(如答案所示)。

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

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

1 个答案:

答案 0 :(得分:1)

由于您链接的帖子中讨论的原因,对于某些编译器,您也无法执行此操作。我想这就是重点。这是一个缺失的功能,编译器甚至不会尝试隐藏它:

  

C3057:' threadprivate'的动态初始化符号当前不支持

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

     foreach(var id in IDsToRemove){
         flowers.remove(id) }

     ddlFlowers.DataSource = flowers.ToList();

但你必须坚持const int gx = 3; const int gy = -2; point2d local_point = {gx, gx+gy}; #pragma omp threadprivate ( local_point ) 基本类型。如果您想在函数内初始化const变量(必须是threadprivate),可以使用static(它会自然地使用第三项,副本分配)

copyin

甚至更好

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

摆脱限制。