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

标签 c++ struct openmp private

我不知道如何使结构或对象成为线程私有(private)的,我正在做的事情会产生错误:

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

我声明了一个静态结构并尝试使它们成为线程私有(private)的

    static  point2d myPoint;
    #pragma omp threadprivate(myPoint)

它会产生一个错误:

error C3057: 'myPoint' : dynamic initialization of 'threadprivate' symbols is not currently supported

这是否意味着当前的 openmp 编译器不支持将 struct threadprivate 设为私有(private)?或者我做的是错的。 是否有任何替代方法来传递结构或对象?

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

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

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

    }

最佳答案

在 C++ 中,具有方法的结构是默认为公共(public)的类。这不是 plain-old-data (POD) . MSVC seems to imply that it can handle threadprivate objects (i.e. non-POD)但我似乎无法让它工作。我确实让它在 GCC 中像这样工作:

extern point2d myPoint;
#pragma omp threadprivate(myPoint)
point2d myPoint;

但是有一个变通办法可以与 MSVC(以及 GCC 和 ICC)一起工作。您可以使用 threadprivate 指针。

threadprivate 的目的是为每个线程提供私有(private)版本的对象/类型,并使值在并行区域之间保持不变。您可以通过 delcaring 指向 point2d 的指针,使该线程私有(private),然后为并行区域中的每个线程的私有(private)指针分配内存来做到这一点。确保在上次并行调用时删除分配的内存。

#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;
    }
}

关于c++ - 如何在 OpenMP 中将对象或结构定义为 threadprivate?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23552077/

相关文章:

struct - 嵌入式类型和结构的多态性

c++ - 将 openmp 与 odeint 和自适应步长一起使用

c++ - openmp 并行 for 循环,具有两个或更多减少

c++ - 在 C++ 中没有 CImage 的 HBITMAP 到 JPEG/PNG

c++ - 在继承类中没有匹配的泛型委托(delegate)作为 lambda 参数

go - 传递与 Golang 中指定的参数类型不同的参数类型?

go - 如何初始化特定的结构格式

c - openmp 中嵌套 for 循环的性能改进失败

c++ - Execvp 仅正确运行第一个命令

c++ - 将 BOOST_FOREACH 替换为 "pure"C++11 替代方案?