gpt4 book ai didi

for-loop - OpenMP 循环中的数据成员

转载 作者:行者123 更新时间:2023-12-04 18:51:19 24 4
gpt4 key购买 nike

我有以下类(class):

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

并希望在创建 L 的对象并且初始化 cArray 中的所有元素之后调用函数 foo 中的 for 循环并行化。
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 静态,有什么可以做的吗?

最佳答案

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

不幸的是,如果你想限定所有数据的范围(使用明确的数据范围条款),你应该这样做,那么你就有问题了。范围条款只能处理变量——哪些类数据成员不能。只要默认值保持共享,就可以将它们从任何数据范围条款中删除。如果您希望它们是私有(private)的,那么您就不走运了,需要将类数据成员定义为变量。不幸的是,由于 OpenMP 不是基础语言的一部分,我认为这种情况不会很快发生变化。

关于for-loop - OpenMP 循环中的数据成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5891641/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com