我试图编译以下代码:
#pragma omp parallel shared (j)
{
#pragma omp for schedule(dynamic)
for(i = 0; i != j; i++)
{
// do something
}
}
但我遇到了以下错误:error: invalid controlling predicate。根据OpenMP标准,对于
parallel for
构造器,它“仅允许”使用以下操作符之一:<
,<=
,>
>=
。我不理解为什么不允许使用
i != j
。在静态调度的情况下,我可以理解,因为编译器需要预先计算分配给每个线程的迭代次数。但是,我无法理解为什么在这种情况下限制使用此操作符。有什么线索吗?
编辑: 即使我使用
for(i = 0; i != 100; i++)
,尽管我可以直接使用 “<” 或 “<=”。
0 2 4 6 8
,但即使使用两个线程,它也会产生以下输出:0 2 4 5 7 9
。 - Hristo Iliev<
的行为很容易,而定义!=
的行为则相当困难。 - Richard<
比!=
包含更多信息,平均而言多两倍,正如@Richard所说,如果我看到循环中使用了这种符号,那么在我理解循环中实际发生了什么之前,我必须阅读循环体。 - Jonathan Dursi