2012-05-03 21 views
5

Estoy bastante impresionado por la biblioteca C++ Eigen que usa plantillas de expresión para obtener una enorme aceleración en el cálculo de matriz/vector.Scala LMS para escribir álgebra lineal Lib

Me gustaría clonar esta biblioteca en scala. Por lo que sé, el sistema de tipo scalas no es lo suficientemente potente como para hacer algo como esto, pero debería ser posible LMS de estadificación modular ligero. Parece que hay varios proyectos por ahí (Delight, lms de virtualización, etc.). ¿Cuál sería el derecho de usar para este tipo de proyecto en términos de confiabilidad y rendimiento?

Gracias

Editar: Acabo de encontrar las macros en Scala 2.10. Quizás esto es lo que quiero usar aquí.

@ om-nom-nom

La parte importante es explicado en http://eigen.tuxfamily.org/dox/TopicInsideEigenExample.html

El ejemplo explica que una suma de vectores

u = v + w 

tiene buen desempeño en (nativo) C++ ya que una Se crea una variable temporal para la adición y esta variable se asigna a u como

for(int i = 0; i < size; i++) tmp[i] = v[i] + w[i]; 
for(int i = 0; i < size; i++) u[i] = tmp[i]; 

Eigen utiliza metaprogramming plantilla (paso a paso se explica en el siguiente enlace) para reducir esta en tiempo de compilación a

for(int i = 0; i < size; i++) u[i] = v[i] + w[i]; 

que obviamente es más rápido y no necesita una variable adicional.

+0

Podría ayudar, si describe brevemente el mecanismo de las plantillas de expresión. –

Respuesta

1

de responder correctamente a esta pregunta, es necesario hacerse preguntas adicionales:

  1. ¿Estás realmente seguro de que el código C++ con plantillas se comporta mejor que el código Scala? Los puntos de referencia modernos muestran que Java es más rápido que C++ en la inversión de matriz. Esto se debe principalmente a una mejora en VM, así como en HW.

  2. ¿Cuán grandes son los beneficios comerciales que obtendría al tener una herramienta matricial más rápida en comparación con el aumento en el costo de manejar la memoria no administrada, punteros colgantes y errores y errores debido a la codificación en C++?

  3. Si el problema puede resolverse con un rendimiento satisfactorio en Scala a pequeña escala, y las diferencias se vuelven significativas solo a gran escala, no sería razonable dividir el problema (multiplicación de matriz/vector) en tareas diferentes que se puede ejecutar en paralelo?

Nota personal: tenía pocas discusiones correos electrónicos con Joshua Bloch, uno de los más influyentes desarrolladores de Java nunca y autor de Effective Java, y él me ha apuntado hacia una interesante presentación por Brian Goletz (autor de Java concurrencia en la práctica y muy influyente en el mundo Java también): Not Your Father's Von Neumann Machine: A Crash Course in Modern Hardware


Si la conclusión de que el beneficio está ahí y esto es importante, y que en el futuro su Tam problema no va a crecer para que y No necesitaría beneficiarse de la ejecución de múltiples núcleos, es probable que necesite permanecer en C++. En el otro caso, eche un vistazo a Scala Macros, que están disponibles desde 2.10-M3.

* Extra: evitar una variable intermedia en realidad no tiene sentido cuando se utilizan lenguajes que se ejecutan en la parte superior de la VM, como Java o C#. De hecho, como el artículo que señaló correctamente describió, hay un cierto peligro en cómo la JVM traduce bytecode java en ensamblador con el JIT. Muchas de las optimizaciones que se pueden ejecutar a mano ya las aplica la JVM, y la mayoría de este razonamiento es inútil si se toma la precaución de declarar los métodos y variables FINAL. *

+0

Gracias por su comentario. De hecho, existe la pregunta de si C++ es aún más rápido que Java. [link] (https://github.com/mikiobraun/jblas/wiki/Java-Native-Code-Background) da algunos consejos, y hay proyectos como magma que se pueden usar usando JNI. Sin embargo, mi pregunta es diferente. Se trata más bien de evitar variables temporales y cálculos innecesarios (como, por ejemplo, multiplicar con una matriz de identidad). –

Cuestiones relacionadas