linux - Obtenga GNU Octave para trabajar con un procesador multinĂșcleo.(Multihilo)
multithreading multicore (3)
Quiero poder programar varios subprocesos con gnu octave para que utilicen múltiples procesadores.
Instalé GNU Octave en Fedora 17 Linux e hice lo siguiente:
yum install octave
Que instalé en mi computadora la última versión de octava, 3.6.2. Funciona muy bien, sin embargo, cuando se multiplican dos matrices enormes, se atasca la única CPU que utiliza la octava. Sería bueno si la multiplicación de matrices utiliza todos los núcleos, ya que en este caso la CPU es obviamente el cuello de botella.
¿Puede la octava utilizar completamente los procesadores de múltiples núcleos y ejecutarse en varios subprocesos? ¿Hay una biblioteca o marca de tiempo de compilación para esto?
En Octave-Forge hay dos paquetes que tratan con la computación paralela:
También es posible generar subprocesos utilizando la función fork()
.
Según lo sugerido por Eric, traté de usar ATLAS y mejoró mi rendimiento 3x (en la aplicación de aprendizaje NN, el costo principal es la multiplicación de matrices). Sorprendentemente, parecía que todavía utilizaba un solo núcleo. Después de una investigación adicional, me topé con OpenBLAS y comencé a usar múltiples núcleos fuera de la caja y mejoré el rendimiento 2 veces más (aunque solo tenía 2 núcleos). Si desea exprimir más, también puede intentar usar MKL , pero el espacio en el disco es pesado debido a las dependencias.
Estaba usando Arch Linux con los paquetes community / atlas-lapack-base y aur / openblas-lapack . La instalación de cada uno de ellos cambió el predeterminado utilizado en Octave.
Aquí hay un buen punto de referencia que compara esas bibliotecas: http://www.tcm.phy.cam.ac.uk/~mjr/linpack/
Solución
Octave es una aplicación de un solo hilo que se ejecuta en un núcleo. Puede obtener una octava para usar algunas bibliotecas como ATLAS que utilizan múltiples núcleos. Entonces, mientras que Octave solo usa un núcleo, cuando encuentra una operación pesada, la octava llama a funciones en ATLAS que utilizan muchas CPU.
Pude hacer esto Primero compile ''ATLAS'' desde el código fuente y hágalo disponible en su sistema para que la octava pueda encontrarlo y usar esas funciones de biblioteca. ATLAS se ajusta a su sistema y número de núcleos. Cuando instala octava desde la fuente y especifica ATLAS, la usa, por lo que cuando octava realiza una operación pesada como una gran multiplicación de matrices, ATLAS decide la cantidad de cpu que debe usar.
No pude conseguir que esto funcionara para Fedora, pero en Gentoo podía hacerlo funcionar.
Utilicé estos dos enlaces: ftp://ftp.gnu.org/gnu/octave/
http://math-atlas.sourceforge.net/
Ejecuté el siguiente núcleo de octava antes y después de la instalación de ATLAS:
tic
bigMatrixA = rand(3000000,80);
bigMatrixB = rand(80,30);
bigMatrixC = bigMatrixA * bigMatrixB;
toc
disp("done");
La multiplicación de matrices es mucho más rápida con múltiples procesadores, que fue 3 veces más rápido que antes con un solo núcleo:
Without Atlas: Elapsed time is 3.22819 seconds.
With Atlas: Elapsed time is 0.529 seconds.
Las tres bibliotecas que estoy usando para acelerar el proceso son blas-atlas
, cblas-atlas
, lapack-atlas
.
Si la octava puede usar estas bibliotecas en lugar de las bibliotecas predeterminadas de blas y lapack, entonces utilizará el núcleo múltiple.
No es fácil y requiere cierta habilidad de programación para obtener una octava para compilar desde la fuente con ATLAS.
Drabacks para utilizar Atlas:
Este software de Atlas utiliza una gran cantidad de gastos generales para dividir su programa de octava en varios subprocesos. Seguro que va mucho más rápido si todo lo que estás haciendo son enormes multiplicaciones de matrices, pero la mayoría de los comandos no pueden ser multiproceso por atlas. Si extraer cada bit de la potencia / velocidad de procesamiento de sus núcleos es la máxima prioridad, tendrá mucha mejor suerte simplemente escribiendo su programa para que se ejecute en paralelo consigo mismo. (Divida su programa en 8 programas equivalentes que funcionen en 1/8 del problema y ejecútelos a la vez, cuando todos hayan terminado, vuelva a ensamblar los resultados).
Atlas ayuda a que un programa de octava de un solo subproceso se comporte un poco más como una aplicación de múltiples subprocesos, pero no es una bala de plata. Atlas no hará que su programa Octave de un solo subproceso maximice su procesador central de 2,4,6,8. Notará una mejora en el rendimiento, pero la mejora lo dejará en la búsqueda de una mejor manera de usar todo el procesador. La respuesta es escribir su programa para que se ejecute en paralelo consigo mismo, y esto requiere mucha habilidad de programación.
Sugerencia
Ponga su energía en vectorizar sus operaciones más pesadas y distribuya el proceso a través de n hilos en ejecución simultánea. Si está esperando demasiado tiempo para que se ejecute un proceso, lo más probable es que la fruta que cuelga más bajo para acelerarlo esté utilizando un algoritmo o estructura de datos más eficiente.