¿C ++ moderno en informática científica?

22

Estoy buscando libros o artículos, o publicaciones de blog, o cualquier material publicado en general, que aborde específicamente los usos de las características modernas de C ++ (semántica de movimiento, STL, iteradores, evaluación diferida, etc.) en informática científica. ¿Puedes sugerir alguna?

Creo que estas nuevas características facilitarán la escritura de código eficiente, pero no he encontrado ejemplos reales. La mayoría de las referencias que he leído son sobre usos genéricos de C ++ y no contienen ejemplos de computación científica. Así que estoy buscando ejemplos (no tienen que ser ejemplos de código de producción, solo ejemplos pedagógicos, a nivel de, digamos, Recetas Numéricas) de código de computación científica que usa características modernas de C ++.

Tenga en cuenta que no estoy preguntando acerca de las bibliotecas que usan estas características. Estoy preguntando sobre artículos / libros / etc. explicando cómo puedo explotar estas características en la informática científica.

llamar
fuente
2
¿Está preguntando sobre "moderno" en el sentido de lo que se entiende como la mejor práctica hoy en día (en comparación con hace 20 años), o "moderno" en el sentido específico de C ++ 11/14?
Kirill
2
@ Kirill supongo que son las dos cosas. Principalmente algo que usa C ++ 11/14, pero siguiendo las mejores prácticas.
Becko

Respuestas:

11

Dos ejemplos de bibliotecas que usan construcciones modernas de C ++:

  • Tanto las bibliotecas eigen como el armadillo (álgebra lineal) usan varias construcciones modernas de C ++. Por ejemplo, usan ambas plantillas de expresión para simplificar las expresiones aritméticas y a veces pueden eliminar algunos temporales:

http://eigen.tuxfamily.org

http://arma.sourceforge.net/

http://hpac.rwth-aachen.de/teaching/sem-accg-14/Armadillo.pdf (presentación sobre plantillas de expresión en Armadillo)

  • La biblioteca CGAL (geometría computacional) utiliza muchas características modernas de C ++ (utiliza en gran medida plantillas y especializaciones):

http://www.cgal.org

Nota:

Las construcciones modernas de C ++ son muy elegantes y pueden ser muy divertidas de usar. Es tanto un punto fuerte como una debilidad: cuando se usan, es tan tentador agregar varias capas de plantillas / especializaciones / lambdas que al final a veces se obtiene más "administración" que código efectivo en el programa (en otras palabras, su programa "habla" más sobre el problema que describiendo la solución). Encontrar el equilibrio correcto es muy sutil. Conclusión: uno necesita rastrear la evolución de la relación "señal / ruido" en el código midiendo :

  • ¿Cuántas líneas de código en el programa?
  • ¿Cuántas clases / plantillas?
  • tiempo de ejecución ?
  • consumo de memoria?

Todo lo que aumenta los dos primeros puede considerarse como un costo (porque puede hacer que el programa sea más difícil de entender y mantener), todo lo que disminuye los dos últimos es una ganancia .

Por ejemplo, la introducción de una abstracción (una clase virtual o una plantilla) puede factorizar el código y hacer que el programa sea más simple ( ganancia ), pero si nunca se deriva / instancia una sola vez, entonces introduce un costo sin ganancia asociada (nuevamente es sutil porque la ganancia puede venir más adelante en la evolución futura del programa, por lo tanto, no existe una "regla de oro").

La comodidad del programador también es un factor importante a tener en cuenta en el balance de costo / ganancia: con demasiadas plantillas, el tiempo de compilación puede aumentar significativamente y los mensajes de error se vuelven difíciles de analizar.

Ver también

¿En qué medida la programación genérica y la metaprogramación usando plantillas C ++ son útiles en la ciencia computacional?

BrunoLevy
fuente
2
Lo mismo vale para Armadillo y Eigen, ¿no?
dr.blochwave
Sí, tienes razón (acabo de revisar la documentación de Armadillo, estoy menos familiarizado con ella). Estoy editando la publicación.
BrunoLevy
1
Los tiempos de compilación más largos son otro costo que vale la pena mencionar.
Kirill
@ Kirill, sí, un buen punto (editó la publicación para mencionarlo), gracias.
BrunoLevy
10

Sugeriría echar un vistazo a Deal.II. Utiliza el STL, sus propios iteradores, punteros compartidos, etc.

Los diversos solucionadores lineales pueden usar las diversas matrices debido a cómo se diseñó. No he encontrado ningún uso de la semántica de movimiento, pero eso no significa que no estén allí. Aquí hay un enlace.

Fred
fuente
También OpenFOAM : uso bastante extenso de plantillas.
tpg2114
1
deal.II no usa semántica de movimiento (porque se abstiene de usar las características del lenguaje C ++ 11, pero usa las características de la biblioteca C ++ 11 para las que hay reemplazos en BOOST para compiladores más antiguos). Sin embargo, utiliza prácticamente todas las demás funciones del lenguaje C ++, incluidas todas las que se hicieron en la pregunta original.
Wolfgang Bangerth
No parece fácil ver una gran biblioteca en detalles.
Michael
7

La biblioteca HPX hace un uso intensivo de una gama de características de C ++ 11, como los constructores de movimientos, y también pretende ser una implementación completa de N4409 (Borrador de trabajo, especificación técnica para extensiones de C ++ para paralelismo).

Tienen una lista de publicaciones en su sitio que incluye una serie de ejemplos del uso de la biblioteca para acelerar la computación científica. También hay una discusión muy interesante sobre la biblioteca y su uso de C ++ moderno en este episodio de CppCast .

SteveL
fuente
Bienvenido a scicomp.se! Si agrega enlaces o cita algunos artículos / libros / publicaciones de blog que discuten esta biblioteca para el cálculo científico, ¡felizmente votaré su respuesta!
duro
5

Sugiero echar un vistazo a Scientific and Engineering C ++: una introducción con técnicas avanzadas y ejemplos de Barton y Nackmann .

El hecho de que este libro fue publicado en 1994 hace que parezca violar su criterio de "técnicas modernas". Sin embargo, Barton y Nackmann estaban a la vanguardia de lo que era posible con las plantillas de C ++ en ese momento y las técnicas innovadoras que idearon para lograr un buen rendimiento todavía se utilizan en las últimas bibliotecas de clases de C ++.

Bill Greene
fuente
4

Además de deal.ii (que ya se sugirió aquí) también puede echar un vistazo a la biblioteca de Dune que hace un uso extensivo de algunas características avanzadas de C ++ como metaprogramación de plantillas, rangos de iteradores, punteros inteligentes, etc. También hay una preimpresión reciente de Joachim Schöberl, que comenta sobre el uso de características de C ++ 11, como por ejemplo funciones lambda, para simplificar la implementación de los métodos de elementos finitos en NGSolve. Aumentartambién tiene algunas bibliotecas relacionadas con la programación científica como uBLAS, Graph, etc. Supongo que en la mayoría de estas bibliotecas encontrará buenos ejemplos del uso moderno de C ++. Sin embargo, tenga en cuenta que también puede encontrar malos ejemplos de uso de C ++ avanzado / moderno. En algunos casos, mientras leía el código / documentación, tuve la sensación de que, ocasionalmente, las cosas se generalizaban demasiado en aras de mostrar habilidades avanzadas como TMP, donde el 99% de todas las aplicaciones potenciales una implementación más sencilla también haría trabajo.

Christian Waluga
fuente
3

El libro "Guía para la computación científica en C ++" de Pitt-Francis & Whiteley fue escrito para responder exactamente este tipo de cosas (uso de STL, iteradores, etc.) y está disponible a través de Amazon , o como un libro electrónico del editor .

Divulgación: ¡trabajo en el mismo grupo de investigación que los autores, pero sigo pensando que es un muy buen recurso para esto!

mirams
fuente
1

Creo que este libro es perfecto para usted, como lo fue para mí: Descubriendo C ++ moderno: un curso intensivo para científicos, ingenieros y programadores (C ++ en profundidad) por Peter Gottschling, especialmente si se usa junto con los Principios de programación y la práctica. C ++ 2nd Edition Bjarne Stroustrup. El inventor del propio C ++. Ambos deben proporcionar una base sólida para pararse.

Ramy Elkady
fuente
0

La biblioteca Blaze para álgebra lineal hace un uso intensivo de C ++ 14 en forma de tipos de retorno deducidos y finales. Otras características modernas de C ++ en uso son constexpr, plantillas de alias y una gran cantidad de metaprogramación de plantillas con expresión SFINAE.

También puede usar listas de inicializadores para sus vectores y matrices, p. Ej.

blaze::DynamicVector<int> x{ 4, -1, 3 };

Para obtener más detalles, consulte su página de inicio .

Henri Menke
fuente