簡體   English   中英

如何在OpenMP中將對象或結構定義為threadprivate?

[英]How to define a object or struct as threadprivate in 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;
        }
    };      

我聲明一個靜態結構,並嘗試使它們成為threadprivate

    static  point2d myPoint;
    #pragma omp threadprivate(myPoint)

它會生成錯誤:

錯誤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();
       }

    }

在C ++中,帶方法的struct是一個默認為public的Class。 這不是普通舊數據(POD) MSVC似乎暗示它可以處理threadprivate對象(即非POD),但我似乎無法讓它工作。 我確實讓它在GCC中工作如下:

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

但有一項工作可以與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;
    }
}

你在代碼中所做的是完全正確的。 引用OpenMP標准(強調我的):

具有類類型的threadprivate變量必須具有:

  • 在沒有給定初始值設定項的默認初始化的情況下,一個可訪問的,明確的默認構造函數 ;
  • 一個可訪問的,明確的構造函數,在直接初始化的情況下接受給定的參數;
  • 在使用顯式初始化程序進行復制初始化的情況下,可訪問的,明確的復制構造函數。

粗體的那個看起來就是你的情況。

您遇到的行為似乎是編輯器中缺少的功能或錯誤 奇怪的是,即使海灣合作委員會似乎也有問題 ,而英特爾聲稱工作正常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM