OpenMp无效控制谓词运算符!=

时间:2018-03-05 09:26:41

标签: c gcc openmp

我尝试在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

谢谢!

1 个答案:

答案 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++)

对于其他情况,您可能需要修改代码以将循环转换为规范形式。