2012-09-24 20 views
32

He estado usando Octave y MATLAB para algunos proyectos, y me he encontrado con algunas preguntas. Esta pregunta Why/when should I prefer MATLAB over Octave?) respondió varias, pero todavía hay una persistente ...¿Por qué Octave es más lento que MATLAB?

He leído una serie de publicaciones/otras fuentes que comparan el rendimiento de Octave y MATLAB, y he realizado algunas de mis pruebas en estándar scripts que confirman el consenso general de que Octave es generalmente mucho más lento que MATLAB para operaciones estándar (repetido, por supuesto, para que la comparación sea significativa).

El consenso también parece sugerir que la mayor parte del aumento de rendimiento de MATLAB se puede atribuir a su compilador JIT, que compila grandes bucles en tiempo de ejecución. Esto tiene sentido, y las mayores diferencias de rendimiento parecen ocurrir en estos casos (por ejemplo, Mathworks Matlab vs Gnu Octave)

Mi pregunta es la siguiente: ¿por qué debería ser que el código vectorizado también se ejecute más lentamente en Octave? Parece que en este caso la memoria debe dejarse de lado antes de que el bucle y algún bucle C/C++ nativo realice la operación, lo que igualaría el rendimiento entre Octave y MATLAB para el código vectorizado. Además, ¿esto tiene implicaciones más amplias, es decir, que Octave podría funcionar peor para operaciones complejas, incluso si el código se escribe de forma que un compilador JIT sea innecesario/no utilizado?

+0

Se ha escrito mucho sobre el rendimiento de Jlab de Matlab, el JIT de Matlab no puede realizar llamadas de función en línea, y no estoy seguro de qué tan bien puede optimizar bucles FOR dado los impares diferenciales de rendimiento entre un bucle FOR en Matlab y JAVA (que tiene un JIT de trabajo). Todas las implementaciones de lenguajes interpretados tienen un JIT, pero el de Matlab es bastante débil. – Mikhail

Respuesta

32

Hay cuatro formas de cómo el código Matlab se aceleró:

  • JIT: la compilación en tiempo de ejecución ayuda con bucles, pero parece acelerarse (o al menos interactuar con) otras partes del código, así, de acuerdo con mis observaciones anecdóticas.

  • Implementando funciones en C/C++: Hay un montón de funciones de Matlab/Octave que se implementan en Matlab/Octave. En cada lanzamiento, hay un montón más de ellos que se convierten en integradas.

  • Multithreading: Hay a list of functions que tienen implementaciones multiproceso, lo que acelerará las llamadas a las funciones.

  • Implementaciones generalmente más eficientes. Por ejemplo, el filtro mediano obtuvo un aumento de velocidad masivo para las entradas de enteros hace algunas publicaciones.

Todos estos enfoques necesitan desarrolladores dedicados a hacer el código más rápido. Por lo que sé, una de las principales preocupaciones de los desarrolladores de Octave es asegurarse de que la funcionalidad (Matlab) esté allí, mientras que el aumento del rendimiento parece haber sido un foco del desarrollo de Matlab en los últimos años.

+0

Si observa el rendimiento de un bucle no vectorizado frente a una operación vectorizada equivalente, está claro que para operaciones simples, como un subproducto, Octave puede dedicar el 75% de su tiempo a interpretar el cuerpo del bucle en lugar de realizar operaciones matemáticas. Sospecho que MATLAB JIT'ter también es más capaz de eliminación de subexpresión común; los compiladores generalmente son más conscientes de eso. – MSalters

10

Matlab utiliza internamente Intel Math Kernel Library (Intel MKL) para operaciones vectoriales y matriciales. Esto le da a Matlab una ventaja significativa sobre Octave.

Pruebe los comandos 'versión -lapack' y 'versión -blas' en su Matlab para verificar la versión de MKL que está usando Matlab.

Un enlace rápido que analiza el uso de MKL por Matlab es http://stanford.edu/~echu508/matlab.html.

Intel MKL es propiedad. software.intel.com/en-us/intel-mkl. Sin embargo, para uso no comercial, la versión de Linux es gratuita. Si Octave puede de alguna manera usar el MKL instalado en nuestras máquinas, debería acelerar significativamente Octave.

+2

Eso es realmente interesante. ¿Puede proporcionar un enlace o una cita con más información sobre esto? – darthbith

+0

Esto es interesante. ¿Es propiedad o algo? De lo contrario, ¿por qué Octave no lo usaría también? –

+2

@Sooraj ¿También puede proporcionar un enlace que indique cómo y dónde utiliza Matlab el Intel MKL? Si desea utilizar Intel MKL con Octave, lo más probable es que tenga que compilar Octave usted mismo, consulte: http://software.intel.com/en-us/articles/using-intel-mkl-in-gnu-octave – darthbith