2010-11-25 15 views
16

Tengo un truco justo de programación en varios idiomas. He estado poniendo en práctica mis códigos para la investigación utilizando MATLAB (durante los últimos meses) y por primera vez realmente notado la diferencia en la velocidad de ejecución de MATLAB v $ C (Por mucho que me encanta las capacidades de creación de prototipos tremendamente rápido).(Re) Comenzando con C++ (para computación científica)

Miro para recogida C++ y empezar a usarla en mi investigación. Soy consciente de OOP y he programado un poco de Java (relativamente atrás) y C++ (incluso más atrás). Me gustaría llegar muy profundamente en C++ ahora y por lo tanto necesita sugerencias para los recursos de la misma: (. STL y)

  • Lo que C++ cosas que necesito para recoger realmente para hacer un buen uso de C++?
  • ¿Qué es un buen tutorial/manual para empezar?
  • ¿Cuáles son las bibliotecas numéricas/científicas para C++? GSL? ¿Hay un equivalente (características) de Scipy/Numpy para C++?

Estaré programando en Linux, entonces usaré g ++.

Cualquier puntero a las anteriores preguntas de SO también se aprecia.

+0

Probablemente obtendrás respuestas mucho mejores si describes qué tipo de algoritmos y estructuras de datos usarás. ¿Son solo números o también estás haciendo cálculos simbólicos? ¿Estás haciendo álgebra lineal, FFT, wavelets, etc.? –

Respuesta

7

Usted querrá llegar se agarra a la programación paralela lo más rápido posible. Para el envío de mensajes me gusta este libro por Karniadakis and Kirby. De los libros sobre OpenMP, para la programación de memoria distribuida, this one es el mejor.

Si usted puede tener acceso a ellos, a continuación, de Intel Threading Building Blocks, Matemáticas Kernel Library, y Integrated Performance Primitives son bueno tener. Si no, hay muchas alternativas de código abierto, comience a buscar en Netlib.

Ah, se me olvidó BOOST, que es una necesidad.

+7

Acaba de ingresar a C++. Su enfoque lo va a dejar sin haber resuelto sus pérdidas de memoria antes de comenzar a crear condiciones de carrera. – xscott

+0

@xcott: Bueno ;-) –

+0

@xscott: es posible, pero si alguien está preocupado por la informática científica de alto rendimiento, en algún momento pronto necesitarán usar todos los núcleos en su máquina, en lugar de eso que correr al 50% o 25% de velocidad. 'fork()' probablemente valga la pena intentarlo antes de enhebrar. –

2

Este tutorial es absolutamente genial, pero es posible que no desee abordarlo inicialmente.

http://www.parashift.com/c++-faq/

Asegúrese de leer sobre el STL (Standard Template Library) y otras cosas, utilizando sitios como:

http://cplusplus.com/

Y, echa un vistazo a la biblioteca Boost:

http://www.boost.org/

Para hacer un buen uso de C++, necesita aprender a l al este del STL, eso solo le ahorrará mucho tiempo, pero como parashift menciona, C++ OOP solo está programando con objetos, si no usa enlaces dinámicos.

+0

Haces que suene como que hay algo mal con "solo programar con objetos" (o funciones, plantillas, etc.). La utilidad de los enlaces dinámicos se indica por la necesidad de determinar el tipo/clase para las entradas en el tipo de ejecución: más la excepción que la norma en muchos campos. –

+0

No estoy diciendo que haya nada de malo con el uso de solo objetos. Solo digo que el poder real entra en juego cuando tienes una colección de punteros de clase base, etc. Aquí está la parte a la que me refería (creo, simplemente eché un vistazo), pero repasa por qué los enlaces virtuales/dinámicos son tan importante: http://www.parashift.com/c++-faq/virtual-functions.html Pero no, no estaba tratando de insinuar que era malo. – Josh

+1

Perspectiva interesante ... para mi mente: el poder "real" de C++ entra en juego cuando puedes usar el polimorfismo en tiempo de compilación (o no necesitas ninguno), y el polimorfismo en tiempo de ejecución es el mejor (generalmente) en una situación incómoda (que siempre es bienvenido, pero poco interesante). De todos modos ... no te preocupes :-). –

-2

TRNG es una biblioteca de generación de números aleatorios paralelos. Le permite crear múltiples flujos independientes y fue diseñado para su uso en clusters.

+0

Esto no agrega nada útil. –