For loop OpenMP循环中的数据成员

For loop OpenMP循环中的数据成员,for-loop,openmp,For Loop,Openmp,我有以下课程: Class L{ public: bool foo(vector<bool> & data); private: C** cArray; } L类{ 公众: 布尔富(矢量和数据); 私人: C**cArray; } 并希望在函数foo中并行化for循环,该函数在创建L的对象并初始化cArray中的所有元素后被称为somtime bool L::foo(vector<int> & data){ int ro

我有以下课程:

Class L{
    public:
    bool foo(vector<bool> & data);
    private:
    C** cArray;
}
L类{
公众:
布尔富(矢量和数据);
私人:
C**cArray;
}
并希望在函数foo中并行化for循环,该函数在创建L的对象并初始化cArray中的所有元素后被称为somtime

bool L::foo(vector<int> & data){
int row, col;
#pragma omp parallel shared(SIZE, cArray, data) private(row, col)
    for (row=0, row<SIZE; ++row)
    {
        for (col=0; col<SIZE; ++col)
        {
            cArray[row][col].computeScore(data);
        }
    }
}    
bool::foo(向量和数据){
int row,col;
#pragma omp并行共享(大小、卡雷、数据)专用(行、列)

对于(row=0,row,这个问题以前已经出现过好几次。问题是,类数据成员可能不会在编译时实例化。如果它们是共享的,那么就没有问题,因为变量在OpenMP中默认共享(除非您将默认值更改为private-这在C中无法实现-或无)。但是,如果它们被定义为私有,则编译器需要知道如何制作私有副本,并且这些信息在编译时并不总是可用


不幸的是,如果您想确定所有数据的范围(使用显式数据范围子句),您应该这样做,那么您就有问题了。作用域子句只能处理变量-哪些类数据成员不是。只要默认值仍然是共享的,就不使用任何数据作用域子句。如果您希望它们是私有的,那么您就倒霉了,需要将类数据成员定义为变量。不幸的是,由于OpenMP不是基本语言的一部分,我不认为这会很快改变。

< p>您可以使用C++ 11 thraseLoad类似的地方。然后它都应该按照预期工作。

//h

L类{

public:
bool foo(vector<bool> & data);
private:
static thread_local C** cArray;
公共:
布尔富(矢量和数据);
私人:
静态线程\u本地C**cArray;
}

//.cpp


thread_local C**cArray;

您能显示声明大小的位置吗?只能在数据共享子句中指定变量。不要将其放入子句中,默认情况下它应该是共享的,并且应该可以工作。@Mr Fooz-SIZE在included.h文件中声明为const。@ejd-so“#pragma omp parallel private(row,col)”默认情况下是否将大小、cArray和数据保留为共享?声明和
L::foo
的定义之间存在不一致:前者使用
vector
,后者使用
vector