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)
在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)
归档时间: |
|
查看次数: |
2546 次 |
最近记录: |