我正在将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
答案 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
。