c++ multithreading c++11 openmp atomic

Mezcla de C++ 11 atomics y OpenMP



multithreading c++11 (2)

OpenMP tiene su propio soporte para acceso atómico, sin embargo, hay al menos dos razones para preferir los atómicos C ++ 11: son significativamente más flexibles y son parte del estándar. Por otro lado, OpenMP es más poderoso que la biblioteca de hilos C ++ 11.

El estándar especifica la biblioteca de operaciones atómicas y la biblioteca de soporte de hilos en dos capítulos distintos. Esto me hace creer que los componentes para el acceso atómico son algo ortogonales a la biblioteca de hilos utilizada. ¿Puedo combinar C ++ 11 atomics y OpenMP?

Hay una pregunta muy similar sobre Stack Overflow; Sin embargo, ha estado básicamente sin respuesta durante tres años, ya que su respuesta no responde a la pregunta real.


Actualizar:

OpenMP 5.0 define las interacciones con C ++ 11 y más. Entre otros, dice que el uso de las siguientes características puede resultar en un comportamiento no especificado:

  • Ordenación de dependencia de datos: modelo atómico y memoria
  • Adiciones a la biblioteca estándar.
  • Biblioteca C ++ 11

Claramente, la mezcla de C ++ 11 atomics y OpenMP 5.0 dará como resultado un comportamiento no especificado. Al menos el estándar en sí mismo promete que "se espera que las futuras versiones de la especificación OpenMP aborden [estas] características".

Antigua discusión:

Curiosamente, el estándar OpenMP 4.5 (2.13.6) tiene una referencia bastante vaga a los atómicos de C ++ 11, o std::memory_order más específico:

La intención es que, cuando la operación análoga exista en C ++ 11 o C11, una construcción atómica secuencialmente consistente tenga la misma semántica que una operación atómica memory_order_seq_cst en C ++ 11 / C11. Del mismo modo, una construcción atómica no secuencialmente consistente tiene la misma semántica que una operación atómica memory_order_relaxed en C ++ 11 / C11.

Desafortunadamente, esto es solo una nota, no hay nada que defina que están jugando muy bien juntos. En particular, incluso la última vista previa de OpenMP 5.0 todavía se refiere a C ++ 98 como la única referencia normativa para C ++. Entonces , técnicamente, OpenMP ni siquiera es compatible con C ++ 11 .

Aparte de eso, probablemente funcionará la mayor parte del tiempo en la práctica. Estoy de acuerdo en que usar std::atomic tiene menos potencial de problemas si se usa junto con OpenMP que el subproceso C ++ 11. Pero si hay algún problema, puede que no sea tan obvio. El peor de los casos sería un atómico que no funciona atómicamente, aunque tengo serios problemas para imaginar un escenario realista en el que esto pueda suceder. Al final del día, puede que no valga la pena y lo más seguro es quedarse con OpenMP puro o puro C ++ 11 thread / atomics.

Tal vez Hristo tiene algo que decir sobre esto, mientras tanto revisa esta respuesta para una discusión más general. Aunque un poco anticuado, me temo que aún se mantiene.


Actualmente esto no está especificado por OpenMP 4.5. En la práctica, puede usar operaciones atómicas de C ++ 11 con hilos OpenMP en la mayoría de los compiladores, pero no existe una garantía formal de que funcione.

Debido al comportamiento no especificado, GCC no admitía atómicas C11 (que son casi idénticas en semántica a atómicas C ++ 11) y subprocesos OpenMP hasta hace poco. Consulte https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65467 para más detalles.

OpenMP 5.0 hizo un intento de abordar esto. Las referencias del lenguaje normativo se actualizaron a C11 y C ++ 11. Sin embargo, el modelo atómico y de memoria de estos "no es compatible", lo que significa que está definido por la implementación. Me gustaría que OpenMP 5.0 dijera más, pero es extremadamente difícil definir la interacción de OpenMP y los atómicos del lenguaje ISO.