2011-05-05 44 views
5

我有下面的类:数据成员

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

并希望并行化在函数foo循环被创建L的对象和所有中的元素之后somtime称为cArray被初始化。

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); 
     } 
    } 
}  

但这给出一个错误: 错误C3028:“L :: CARRAY”:只有一个变量或静态数据成员可以在数据共享子句中使用。

有没有什么可以做这个假设我不想让cArray静态?

+0

你可以显示声明SIZE的位置吗? – 2011-05-05 01:22:08

+1

只能在数据共享条款中指定变量。不要把它放到一个子句中,它应该默认共享,并且应该工作。 – ejd 2011-05-05 01:31:19

+0

@Mr Fooz - SIZE在包含的.h文件中声明为const。 – ryguy 2011-05-05 01:53:23

回答

6

这个问题已经出现了几次。问题是,类数据成员可能不会在编译时实例化。如果它们被共享,那么就没有问题了,因为变量在OpenMP中是默认共享的(除非您将默认值更改为私有值 - 在C中您不能这么做 - 或者没有)。但是,如果它们被定义为私有的,那么编译器需要知道如何创建私有拷贝,并且这些信息在编译时并不总是可用的。

不幸的是,如果你想限制你所有的数据(使用显式数据范围子句),你应该这样做,那么你就有一个问题。范围子句只能处理变量 - 哪些类数据成员不是。只要默认保持共享,就将它们从数据范围子句中移除。如果您希望它们是私有的,那么您运气不佳,需要将类数据成员定义为变量。不幸的是,由于OpenMP不是基础语言的一部分,我不会很快看到这种变化。