使用#omp时,与'operator - '不匹配

xcs*_*ski 2 c++ openmp

我正在向现有代码添加OpenMP,并尝试并行化下面的for循环.Block是代码中实现的容器.运算符<和++是为Block容器实现的.

#pragma omp parallel for // code compiles without this line
for ( Block::iterator it = initValue; it < blockEnd; ++it ) {
  // LOOP BODY
}
Run Code Online (Sandbox Code Playgroud)

当OpenMP pragma存在时,我收到以下错误:

No match for 'operator-' (operand types are Block::iterator and Block::iterator)
Run Code Online (Sandbox Code Playgroud)

如果我把pragma取出来,代码编译得很好,所以我确信我的运算符定义是正确的.为什么OpenMP需要在这里实现'operator-'?

编译器:gcc 7.2.1 OpenMP 4.0

Zul*_*lan 6

OpenMP仅支持RandomAccessIterators的迭代器循环.显然,Block::iterator不满足它,缺少相应的operator-.

编辑:另一个答案提供了一些关于GCC如何使用的提示operator-.但是,真正的答案仍然是:OpenMP标准要求您实现a RandomAccessIterator,以及所有必需的操作.请注意,这更进一步.如果不这样做,可能会导致您的代码使用特定的GCC版本,但不能使用其他版本或编译器.


nob*_*bar 3

错误消息实际上非常明确地说明了缺少的内容:

与“operator-”不匹配(操作数类型为 Block::iterator 和 Block::iterator)

尝试使用如下签名实现独立函数:

int operator - ( Block::iterator a, Block::iterator b );
Run Code Online (Sandbox Code Playgroud)

我根据你描述的场景模拟了这个,发现它在 g++-5.4 下工作。


为什么 OpenMP 需要在这里实现“operator-”?

OpenMP 根据循环将执行的线程数将循环划分为多个段。要做到这一点,需要一点数学知识。

首先,总工作量有多大?回答:blockEnd-initValue