es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Es legal utilizar OpenMP con más de INT_MAX iteraciones?

Aquí hay un bucle que funciona perfectamente bien:

#include <inttypes.h>
#include <iostream>

int main() {
  for (int32_t i = -2; i < INT32_MAX-2; i++) {
    std::cout << i << std::endl;
  }
}

Añadir la cláusula omp parallel for parece romper el código al introducir un desbordamiento de enteros.

#include <inttypes.h>
#include <iostream>

int main() {
  #pragma omp parallel for
  for (int32_t i = -2; i < INT32_MAX; i++) {
    std::cout << i << std::endl;
  }
}

Para clang-10 y gcc-10, el programa no produce ninguna salida. Sin embargo, clang-12 parece manejarlo correctamente.

clang-10 al menos produce algunas advertencias:

> clang++-10 int_div.cpp -Wall -fopenmp
int_div.cpp:133:3: warning: overflow in expression; result is -2147483647 with type 'int' [-Winteger-overflow]
  for (int i = -2; i < INT32_MAX; i++) {
  ^
int_div.cpp:133:3: warning: overflow in expression; result is 2147483646 with type 'int' [-Winteger-overflow]
int_div.cpp:133:3: warning: overflow in expression; result is -2147483647 with type 'int' [-Winteger-overflow]
int_div.cpp:133:3: warning: overflow in expression; result is -2147483647 with type 'int' [-Winteger-overflow]
int_div.cpp:133:3: warning: overflow in expression; result is -2147483647 with type 'int' [-Winteger-overflow]

¿Es este un comportamiento legal y bien definido por el estándar de OpenMP o es un error de implementación?</inttypes.h></inttypes.h>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece ser un error de implementación en clang-10 y gcc-10. El estándar de OpenMP no especifica ningún comportamiento que resulte en desbordamiento de enteros, y el código sin la cláusula omp parallel for se ejecuta sin problemas. Es posible que la adición de directivas de OpenMP altere cómo se optimiza y compila el bucle, lo que lleva a este problema de desbordamiento en algunos compiladores. El hecho de que clang-12 maneje correctamente el código respalda esta teoría. Por lo tanto, se recomienda utilizar una versión más reciente de los compiladores, especialmente si se trabaja con paralelización de OpenMP.

Comments are closed.