不匹配'运营商 - '当使用#omp时

时间:2018-02-19 17:59:56

标签: c++ openmp

我正在将OpenMP添加到现有代码中,并尝试并行化下面的for循环。 Block是代码中实现的容器。运营商<和块容器实现了++。

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

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

No match for 'operator-' (operand types are Block::iterator and Block::iterator)

如果我把pragma取出来,代码编译得很好,所以我确信我的运算符定义没问题。为什么OpenMP需要&#39;运营商 - &#39;在这里实施?

编译器:gcc 7.2.1 OpenMP 4.0

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:2)

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

  

不匹配&#39;运营商 - &#39; (操作数类型是Block :: iterator和   块:迭代)

尝试使用以下签名实现独立功能:

int operator - ( Block::iterator a, Block::iterator b );

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

  

为什么OpenMP需要&#39;运营商 - &#39;在这里实施?

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

对于初学者来说,总工作有多大?答案:blockEnd-initValue