[英]How to use direct initialization of an object in OpenMP threadprivate directives?
[英]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.