我有以下课程:
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静态,有什么可以做的吗?
这个问题之前已经提出过好几次了.问题是,类数据成员可能无法在编译时实例化.如果它们被共享,则没有问题,因为默认情况下在OpenMP中共享变量(除非您将默认值更改为私有 - 您无法在C中执行 - 或者没有).但是,如果将它们定义为私有,则编译器需要知道如何创建私有副本,并且此信息在编译时并不总是可用.
不幸的是,如果你想要扩展所有数据(使用显式数据范围条款),那么你应该有问题.范围子句只能处理变量 - 哪些类数据成员不是.只要默认值保持共享,就可以将它们从任何数据范围子句中删除.如果您希望它们是私有的,那么您运气不好,需要将类数据成员定义为变量.不幸的是,由于OpenMP不是基本语言的一部分,我不会很快看到这种变化.
| 归档时间: |
|
| 查看次数: |
2697 次 |
| 最近记录: |