代码之家  ›  专栏  ›  技术社区  ›  Fred Foo

为什么必须对循环变量进行并行签名?

  •  7
  • Fred Foo  · 技术社区  · 15 年前

    我只是从在线教程和资源中学习OpenMP。我想用一个 parallel for 循环。在 IBM compiler documentation ,我发现了“迭代变量必须是 signed 整数。“这在GCC实现中也是真的吗?它是在OpenMP标准中指定的吗?如果是这样,是否有理由这样做?

    (这并不重要,因为预期尺寸远小于 INT_MAX 但是我花了不少钱。)

    4 回复  |  直到 12 年前
        1
  •  5
  •   Alex F    15 年前

    根据OpenMP 3.0规范: http://www.openmp.org/mp-documents/spec30.pdf ,对于变量可以是有符号或无符号整数类型,请参见2.5.1循环构造。问题是给定的OpenMP实现是否符合这个最新的规范。

        2
  •  10
  •   Community Mohan Dere    9 年前

    引用 Why aren't unsigned OpenMP index variables allowed? :

    根据 OpenMP 2.0 C/C++ API 规范(PDF),章节 2.4.1,这是for循环的限制之一。没有给出理由 但我怀疑这只是为了 简化代码 编译程序必须做,因为 有特殊的代码来确保 范围没有超出最大值 类型的值。

    OpenMP3.0显然允许 也有无符号类型,但我没有看到 它在行动中。

    简而言之,它是标准的一部分,下一个版本将允许无符号整数。

        3
  •  7
  •   sharptooth    15 年前

    这背后有一个可能的原因。这个 same article

    • b, ub, incr 是循环不变的有符号整数表达式和
    • exit_cond 形式: iv <= ub iv < ub iv >= ub iv > ub (何处) iv 是您询问的迭代变量)

    自从 外锥 条件涉及一个比较,并与签名进行比较 ub 变量循环变量 必须签名以避免签名/未签名比较可能出现的问题。

        4
  •  1
  •   Jens Gustedt    15 年前

    回答你的第一个问题 gcc . 不,看起来 海湾合作委员会 容易接受 unsigned size_t 循环变量

    #pragma omp parallel for
    for (size_t i = 0; i < N; ++i) {
      /* do it */
    }
    

    至少我的(64位Ubuntu上的GCC4.4)没有抱怨 做正确的事。