ACTUALIZACIÓN (30.07.2014):
Vuelvo a ejecutar el punto de referencia en nuestro nuevo HPC. Tanto el hardware como la pila de software cambiaron de la configuración en la respuesta original.
Puse los resultados en una hoja de cálculo de Google (contiene también los resultados de la respuesta original).
Hardware
Nuestro HPC tiene dos nodos diferentes, uno con CPU Intel Sandy Bridge y otro con las CPU Ivy Bridge más nuevas:
Sandy (MKL, OpenBLAS, ATLAS):
- CPU : 2 x 16 Intel (R) Xeon (R) E2560 Sandy Bridge a 2,00 GHz (16 núcleos)
- RAM : 64 GB
Ivy (MKL, OpenBLAS, ATLAS):
- CPU : 2 x 20 Intel (R) Xeon (R) E2680 V2 Ivy Bridge a 2,80 GHz (20 núcleos, con HT = 40 núcleos)
- RAM : 256 GB
Software
La pila de software es para ambos nodos, sam. En lugar de GotoBLAS2 , se utiliza OpenBLAS y también hay un ATLAS BLAS de subprocesos múltiples que se establece en 8 subprocesos (codificado).
- SO : Suse
- Compilador Intel : ictce-5.3.0
- Numpy: 1.8.0
- OpenBLAS: 0.2.6
- ATLAS : 3.8.4
Benchmark de producto escalar
El código de referencia es el mismo que se muestra a continuación. Sin embargo, para las nuevas máquinas también ejecuté el punto de referencia para los tamaños de matriz 5000 y 8000 .
La siguiente tabla incluye los resultados de referencia de la respuesta original (renombrado: MKL -> Nehalem MKL, Netlib Blas -> Nehalem Netlib BLAS, etc.)
![Multiplicación de matrices (tamaños = [1000,2000,3000,5000,8000])](https://i.stack.imgur.com/ZU7u4.png)
Rendimiento de un solo hilo:

Rendimiento de subprocesos múltiples (8 subprocesos):

Hilos frente al tamaño de la matriz (Ivy Bridge MKL) :

Suite Benchmark

Rendimiento de un solo hilo:

Rendimiento de subprocesos múltiples (8 subprocesos):

Conclusión
Los nuevos resultados de referencia son similares a los de la respuesta original. OpenBLAS y MKL funcionan al mismo nivel, con la excepción de la prueba Eigenvalue . Los autovalor realiza la prueba solamente razonablemente bien en OpenBLAS en el modo de un solo subproceso . En el modo de subprocesos múltiples, el rendimiento es peor.
El "gráfico de tamaño de matriz frente a subprocesos" también muestra que aunque MKL y OpenBLAS generalmente escalan bien con el número de núcleos / subprocesos, depende del tamaño de la matriz. Para matrices pequeñas, agregar más núcleos no mejorará mucho el rendimiento.
También hay un aumento de rendimiento de aproximadamente un 30% desde Sandy Bridge hasta Ivy Bridge, lo que podría deberse a una mayor frecuencia de reloj (+ 0,8 Ghz) y / o una mejor arquitectura.
Respuesta original (04.10.2011):
Hace algún tiempo tuve que optimizar algunos cálculos / algoritmos de álgebra lineal que se escribieron en Python usando numpy y BLAS, así que comparé / probé diferentes configuraciones de numpy / BLAS.
Específicamente probé:
- Numpy con ATLAS
- Numpy con GotoBlas2 (1.13)
- Numpy con MKL (11.1 / 073)
- Numpy con Accelerate Framework (Mac OS X)
Ejecuté dos puntos de referencia diferentes:
- producto escalar simple de matrices con diferentes tamaños
- Paquete de referencia que se puede encontrar aquí .
Aquí están mis resultados:
Máquinas
Linux (MKL, ATLAS, No-MKL, GotoBlas2):
- Sistema operativo : Ubuntu Lucid 10.4 de 64 bits.
- CPU : 2 x 4 Intel (R) Xeon (R) E5504 a 2,00 GHz (8 núcleos)
- RAM : 24 GB
- Compilador Intel : 11.1 / 073
- Scipy : 0.8
- Numpy : 1.5
Mac Book Pro (Accelerate Framework):
- Sistema operativo : Mac OS X Snow Leopard (10.6)
- CPU : 1 Intel Core 2 Duo 2,93 Ghz (2 núcleos)
- RAM : 4 GB
- Scipy : 0,7
- Numpy : 1.3
Servidor Mac (Accelerate Framework):
- SO : Mac OS X Snow Leopard Server (10.6)
- CPU : 4 X Intel (R) Xeon (R) E5520 a 2,26 Ghz (8 núcleos)
- RAM : 4 GB
- Scipy : 0.8
- Numpy : 1.5.1
Punto de referencia de producto escalar
Codigo :
import numpy as np
a = np.random.random_sample((size,size))
b = np.random.random_sample((size,size))
%timeit np.dot(a,b)
Resultados :
Sistema | tamaño = 1000 | tamaño = 2000 | tamaño = 3000 |
netlib BLAS | 1350 ms | 10900 ms | 39200 ms |
ATLAS (1 CPU) | 314 ms | 2560 ms | 8700 ms |
MKL (1 CPU) | 268 ms | 2110 ms | 7120 ms |
MKL (2 CPU) | - | - | 3660 ms |
MKL (8 CPU) | 39 ms | 319 ms | 1000 ms |
GotoBlas2 (1 CPU) | 266 ms | 2100 ms | 7280 ms |
GotoBlas2 (2 CPU) | 139 ms | 1009 ms | 3690 ms |
GotoBlas2 (8 CPU) | 54 ms | 389 ms | 1250 ms |
Mac OS X (1 CPU) | 143 ms | 1060 ms | 3605 ms |
Servidor Mac (1 CPU) | 92 ms | 714 ms | 2130 ms |

Suite Benchmark
Código :
para obtener información adicional sobre la suite de referencia, consulte aquí .
Resultados :
Sistema | valores propios | svd | det | inv | punto |
netlib BLAS | 1688 ms | 13102 ms | 438 ms | 2155 ms | 3522 ms |
ATLAS (1 CPU) | 1210 ms | 5897 ms | 170 ms | 560 ms | 893 ms |
MKL (1 CPU) | 691 ms | 4475 ms | 141 ms | 450 ms | 736 ms |
MKL (2 CPU) | 552 ms | 2718 ms | 96 ms | 267 ms | 423 ms |
MKL (8 CPU) | 525 ms | 1679 ms | 60 ms | 137 ms | 197 ms |
GotoBlas2 (1 CPU) | 2124 ms | 4636 ms | 147 ms | 456 ms | 743 ms |
GotoBlas2 (2 CPU) | 1560 ms | 3278 ms | 116 ms | 295 ms | 460 ms |
GotoBlas2 (8 CPU) | 741 ms | 2914 ms | 82 ms | 262 ms | 192 ms |
Mac OS X (1 CPU) | 948 ms | 4339 ms | 151 ms | 318 ms | 566 ms |
Servidor Mac (1 CPU) | 1033 ms | 3645 ms | 99 ms | 232 ms | 342 ms |

Instalación
La instalación de MKL incluyó la instalación completa de Intel Compiler Suite, que es bastante sencilla. Sin embargo, debido a algunos errores / problemas, configurar y compilar numpy con soporte MKL fue un poco complicado.
GotoBlas2 es un pequeño paquete que se puede compilar fácilmente como una biblioteca compartida. Sin embargo, debido a un error , debe volver a crear la biblioteca compartida después de construirla para usarla con numpy.
Además de esta construcción, para múltiples plataformas de destino no funcionó por alguna razón. Así que tuve que crear un archivo .so para cada plataforma para la que quiero tener un archivo libgoto2.so optimizado .
Si instala numpy desde el repositorio de Ubuntu, se instalará y configurará automáticamente numpy para usar ATLAS . La instalación de ATLAS desde la fuente puede llevar algún tiempo y requiere algunos pasos adicionales (fortran, etc.).
Si instala numpy en una máquina Mac OS X con puertos Fink o Mac , configurará numpy para usar ATLAS o Accelerate Framework de Apple . Puede verificar ejecutando ldd en el archivo numpy.core._dotblas o llamando a numpy.show_config () .
Conclusiones
MKL funciona mejor seguido de cerca por GotoBlas2 .
En la prueba de valor propio , GotoBlas2 se comporta sorprendentemente peor de lo esperado. No estoy seguro de por qué es así.
Accelerate Framework de Apple funciona realmente bien, especialmente en el modo de un solo subproceso (en comparación con las otras implementaciones de BLAS).
Tanto GotoBlas2 como MKL escalan muy bien con el número de subprocesos. Entonces, si tiene que lidiar con matrices grandes, ejecutarlo en varios subprocesos será de gran ayuda.
En cualquier caso, no use la implementación predeterminada de netlib blas porque es demasiado lenta para cualquier trabajo computacional serio.
En nuestro clúster también instalé ACML de AMD y el rendimiento fue similar al de MKL y GotoBlas2 . No tengo números difíciles.
Personalmente, recomendaría usar GotoBlas2 porque es más fácil de instalar y es gratis.
Si desea codificar en C ++ / C, también consulte Eigen3, que se supone que supera a MKL / GotoBlas2 en algunos casos y también es bastante fácil de usar.