¿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>
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.