如何在OpenMP中将对象或结构定义为threadprivate?

Cha*_*how 6 c++ struct private openmp

我不知道如何将struct或object作为threadprivate,我正在做的事情会产生错误:

    struct point2d{
        int x;
        int y;
        point2d(){
            x = 0;
            y = 0;
        }
        //copy constructor
        point2d(point2d& p){
            x = p.x;
            y = p.y;
        }
    };      
Run Code Online (Sandbox Code Playgroud)

我声明一个静态结构,并尝试使它们成为threadprivate

    static  point2d myPoint;
    #pragma omp threadprivate(myPoint)
Run Code Online (Sandbox Code Playgroud)

它会生成错误:

错误C3057:'myPoint':目前不支持'threadprivate'符号的动态初始化

这是否意味着当前的openmp编译器不支持这个来构建一个struct threadprivate?或者我正在做的事情是错的.有没有其他方法来传递结构或对象?

这是我的代码的其余部分:

    void myfunc(){
        printf("myPoint at %p\n",&myPoint);
    }

    void main(){
    #pragma omp parallel
       {
           printf("myPoint at %p\n",&myPoint);
           myfunc();
       }

    }
Run Code Online (Sandbox Code Playgroud)

Z b*_*son 5

在C++中,带方法的struct是一个默认为public的Class.这不是普通旧数据(POD). MSVC似乎暗示它可以处理threadprivate对象(即非POD),但我似乎无法让它工作.我确实让它在GCC中工作如下:

extern point2d myPoint;
#pragma omp threadprivate(myPoint)
point2d myPoint;
Run Code Online (Sandbox Code Playgroud)

但有一项工作可以与MSVC(以及GCC和ICC)合作.您可以使用threadprivate指针.

threadprivate的目的是为每个线程提供一个对象/类型的私有版本,并使值在并行区域之间保持不变.您可以通过将指针指向point2d,使该threadprivate,然后为并行区域中的每个线程的私有指针分配内存来实现.确保在上次并行呼叫时删除分配的内存.

#include <stdio.h>
#include <omp.h>

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

static point2d *myPoint;
#pragma omp threadprivate(myPoint)

int main() {

    #pragma omp parallel 
    {
        myPoint = new point2d();
        myPoint->x = omp_get_thread_num();
        myPoint->y = omp_get_thread_num()*10;
        #pragma omp critical
        {
            printf("thread %d myPoint->x %d myPoint->y %d\n", omp_get_thread_num(),myPoint->x, myPoint->y);
        }
    }   
    #pragma omp parallel
    {
        #pragma omp critical
        {
            printf("thread %d myPoint->x %d myPoint->y %d\n", omp_get_thread_num(),myPoint->x, myPoint->y);
        }
        delete myPoint;
    }
}
Run Code Online (Sandbox Code Playgroud)