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

标签 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

谢谢!

最佳答案

OpenMP 规范要求循环采用所谓的规范形式。规范形式在 for 的测试子句中只允许四种类型的关系操作。环形。即< , <= , > , 或 >= .

规范形式的完整规范可以直接从 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 章(章节编号可能会在规范的 future 版本中发生变化)。

对于你例子中的情况

for (p = array; p != stop; p++)

完全等同于

for (p = array; p < stop; p++)

对于其他情况,您可能必须修改代码以使循环成为规范形式。

关于c - OpenMp 运算符 != 的无效控制谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49107084/

相关文章:

linux - gcc __sync_bool_compare_and_swap 和 cmpxchg 之间有什么区别?

c++ - 微软的OpenMP自旋锁时间如何控制?

c++ - 包含函数调用的并行化循环

c - 操作符: in C,是什么?

Colortext 程序无法正确着色

c - C 中的高阶函数作为语法糖,工作量最小

c++ - OpenMP 线程数问题

c - python和c for循环的区别

gcc - (arm-none-eabi-gcc) 从引导加载程序 + 2 x 固件镜像创建 .elf 二进制文件

c - 中断处理程序在真实计算机上不起作用