OpenMP循环中的数据成员

ryg*_*guy 5 for-loop openmp

我有以下课程:

Class L{
    public:
    bool foo(vector<bool> & data);
    private:
    C** cArray;
}
Run Code Online (Sandbox Code Playgroud)

并且想要在创建L的对象并初始化cArray中的所有元素之后,在函数foo中并行化for循环,该函数被称为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);
        }
    }
}    
Run Code Online (Sandbox Code Playgroud)

但这会产生错误:错误C3028:'L :: cArray':只能在数据共享子句中使用变量或静态数据成员.

假设我不想让cArray静态,有什么可以做的吗?

ejd*_*ejd 6

这个问题之前已经提出过好几次了.问题是,类数据成员可能无法在编译时实例化.如果它们被共享,则没有问题,因为默认情况下在OpenMP中共享变量(除非您将默认值更改为私有 - 您无法在C中执行 - 或者没有).但是,如果将它们定义为私有,则编译器需要知道如何创建私有副本,并且此信息在编译时并不总是可用.

不幸的是,如果你想要扩展所有数据(使用显式数据范围条款),那么你应该有问题.范围子句只能处理变量 - 哪些类数据成员不是.只要默认值保持共享,就可以将它们从任何数据范围子句中删除.如果您希望它们是私有的,那么您运气不好,需要将类数据成员定义为变量.不幸的是,由于OpenMP不是基本语言的一部分,我不会很快看到这种变化.