我尝试在C中使用OpenMP,但发现!=
运算符和parallel for
存在问题。
对于下一个代码:
#include <stdio.h>
int main ()
{
int array[] = {1,2,3,4,5, 6, 7};
int *p;
int *stop = array + 7;
#pragma omp parallel for
for (p = array; p != stop; p++)
printf("a: %d\n", *p);
return 0;
}
我收到此错误:
omp.c:10:18: error: invalid controlling predicate
for (p = array; p != stop; p++)
^
但是当我用!=
替换<
时,它会编译并且效果很好。
还有其他选择吗?我希望将代码与“停止”指针并行,并且必须使用!=
运算符。
编译命令:gcc -o omp.o -fopenmp example.c
谢谢!
答案 0 :(得分:3)
OpenMP规范要求循环采用所谓的规范形式。规范形式在for
循环的test子句中仅允许四种类型的关系运算。即<
,<=
,>
或>=
。
规范形式的完整规范可以直接从OpenMP规范中读取:
for ( init-expr ; test-expr ; incr-expr ) structured-block
其中test-expr
是以下之一:
var relational-op b
b relational-op var
relational-op
为<
,<=
,>
或>=
。它是OpenMP specification version 4.5中的第2.6章(章节编号可能会在规范的未来版本中更改)。
对于您的示例中的案例
for (p = array; p != stop; p++)
完全等同于
for (p = array; p < stop; p++)
对于其他情况,您可能需要修改代码以将循环转换为规范形式。