Necesito hacer multiplicaciones en matrices. Estoy buscando una biblioteca que pueda hacerlo rápido. Estoy usando el compilador de Visual C++ 2008 y tengo un Core i7 860, así que si la biblioteca está optimizada para mi configuración, es perfecto.¿Qué es una buena biblioteca de C++ para operaciones de matriz?
Respuesta
Busque en Eigen. Debería tener todo lo que necesita.
¿Utiliza hilos (si no, no es rápido)? – Yttrill
Eigen solo es bueno en matrices pequeñas. No usa hilos para matrices más grandes. Pero usa SSE2 cuando está disponible. –
Bueno, su propio punto de referencia muestra diferente ... Diablos, el enhebrado puede ser implementado por el usuario haciendo productos de bloque si realmente lo necesita. – rubenvb
He tenido una buena experiencia con Boost uBLAS. Es una buena opción si ya estás usando Boost.
¿Utiliza hilos (si no es rápido)? – Yttrill
Utiliza cualquier biblioteca BLAS que esté instalada en su sistema. Intel proporciona uno que usa hilos e instrucciones vectoriales: google para Intel MKL. Sin embargo, no es gratis. –
He tenido una experiencia realmente terrible con uBLAS de Boost. Es completamente intuitivo y difícil de entender. Por ejemplo, ¿cómo se supone que debo saber que la multiplicación de matriz de vectores se hace usando 'prod()' - por qué no un operador '*'? Además, ni siquiera puedo multiplicar dos vectores. –
Puede usar el GNU Scientific Library(GSL).
Aquí hay una página que describe las operaciones con matrices disponibles en la biblioteca, incluyendo la multiplicación (gsl_matrix_mul_elements()):
http://www.gnu.org/software/gsl/manual/html_node/Matrix-operations.html
Y aquí hay algunos enlaces para empezar con el uso de GSL con Visual Studio:
http://gladman.plushost.co.uk/oldsite/computing/gnu_scientific_library.php
¿De verdad? ¿Compilación de código Gnu en MSVC++? Quiero decir, si realmente quieres obtener un rendimiento, utilizarías un BLAS basado en Atlas, pero dudo que sea tan fácil de construir en Windows ... :) – Yttrill
http://math-atlas.sourceforge.net/errata.html# gccCrazy –
Hay una opción para implementar esto usted mismo, tal vez usando std :: valarray porque eso puede ser comparado con OpenMP: gcc ciertamente tiene una versión de este tipo, MSVC++ probablemente también lo haga.
De lo contrario, los siguientes trucos: una de las matrices debe transponerse. Entonces usted tiene:
AB [i, j] = Suma (k) A [i, k] B^t [j, k]
donde se va a escanear memoria contigua. Si tiene 8 núcleos, puede dividir con bastante facilidad el conjunto de índices [i, j] en 8 y otorgar a cada núcleo 1/8 del trabajo total. Para que sea aún más rápido, puede usar instrucciones vector multiplicar, la mayoría de los compiladores proporcionarán una función especial para esto. El resultado no será tan rápido como una biblioteca ajustada, pero debería estar bien.
Si realiza cálculos más largos, como la evaluación polinomial, un evaluador de subprocesos que también tiene soporte de subprocesos (gak, dos tipos de subprocesos) hará un buen trabajo, aunque no hará un ajuste de bajo nivel. Si realmente desea hacer cosas rápidamente, debe usar una biblioteca correctamente ajustada como Atlas, pero entonces, probablemente no estaría ejecutando Windows si fuera serio con respecto a HPC.
Nunca implemente las operaciones de la matriz usted mismo. Use una implementación BLAS. –
no puede competir con las bibliotecas científicas, pero con Visual C++ que está a la mano
#include <windows.h>
#include <gdiplus.h>
#pragma comment (lib,"Gdiplus.lib")
using namespace Gdiplus;
int main()
{
ULONG_PTR gpToken = 0;
GdiplusStartup(&gpToken, &GdiplusStartupInput(), NULL);
//lib inited
Matrix A;
A.Translate(10,20);
Matrix B;
B.Rotate(35.0);
A.Multiply(&B);
if (A.IsInvertible())
A.Invert();
if (!A.IsIdentity())
A.RotateAt(120.0, PointF(10,10));
//getting values
REAL elements[6];
A.GetElements(elements);
//lib stopped
GdiplusShutdown(gpToken);
return 0;
}
por lo que con ello se puede tomar fácilmente el obstáculo de multiplicación de matrices (en Windows)
BLAS es un estándar de Fortran de facto para todas las operaciones básicas de álgebra lineal (esencialmente multiplicaciones de matrices y vectores). Hay numerosas implementaciones disponibles. Por ejemplo:
- ATLAS es gratis y supuestamente auto optimizado. Aunque debes compilarlo tú mismo.
- Goto BLAS es mantenido por Kazushige Goto en TACC. Él es muy bueno obteniendo el último bit de rendimiento de los procesadores modernos. Sin embargo, es solo para uso académico.
- Intel MKL proporciona BLAS optimizado para procesadores Intel. No es gratis, incluso para uso académico.
Luego, es posible que desee utilizar un contenedor de C++, por ejemplo boost::ublas
.
Si programa en sistemas distribuidos, hay PBLAS y ScaLAPACK que permiten el uso del paso de mensajes para operaciones de álgebra lineal distribuida. En una máquina multinúcleo, generalmente las implementaciones de BLAS (al menos Intel MKL) utilizan subprocesos para matrices suficientemente grandes.
Si desea rutinas de álgebra lineal más avanzadas (valores propios, sistemas lineales, menos cuadrados, ...), existe otro estándar Fortran de facto LAPACK. Que yo sepa, no hay nada que integre elegantemente con C++ aparte de llamar a las rutinas de Fortran desnudas. Debe escribir algunos envoltorios para ocultar las llamadas de Fortran y proporcionar una implementación de verificación de tipo de sonido.
FWIW, Eigen 3 utiliza subprocesos (OpenMP) para productos de matriz (en respuesta a la instrucción anterior acerca de que Eigen no usa subprocesos).
para una versión más reciente de Visual Studio, puede usar ScaLapack + MKL. Se proporciona una muestra del código here, con un tutorial sobre cómo hacer que se ejecute.
http://code.msdn.microsoft.com/Using-ScaLAPACK-on-Windows-d16a5e76#content
- 1. ¿Qué es una buena biblioteca de Java para las operaciones dinámicas del cliente SOAP?
- 2. Una buena biblioteca de C++ para SOAP
- 3. ¿Qué es una buena biblioteca de lenguaje natural para parafrasear?
- 4. ¿Qué es una buena biblioteca de trazado para .Net?
- 5. ¿Qué es una buena biblioteca de manipulación de matrices disponible para C?
- 6. ¿Qué es una buena biblioteca de gráficos vectoriales multiplataforma para C/C++?
- 7. ¿Qué es una buena biblioteca RDF para .net?
- 8. ¿Qué es una buena biblioteca de optimización convexa?
- 9. Biblioteca para operaciones de polígono
- 10. ¿Qué es una buena biblioteca de C++ para cargar imágenes de textura en OpenGL?
- 11. Una biblioteca C++ para Arrays, Matriz, Vector y operaciones clásicas de álgebra lineal
- 12. ¿Qué es una buena biblioteca de automatización de Windows .NET?
- 13. ¿Qué es una buena biblioteca de registro activo de PHP?
- 14. ¿Buena biblioteca de programación lineal para C#?
- 15. ¿Buena biblioteca para matemáticas 3D en C#?
- 16. ¿Buena biblioteca HTTP para Objective-C/iPhone?
- 17. Buena biblioteca de manipulación de cadenas C++
- 18. Buena biblioteca similar a STL para C
- 19. ¿Qué es una buena biblioteca de archivos de configuración para c que no es xml (preferiblemente tiene enlaces de python)?
- 20. ¿Qué es una buena biblioteca de Java, similar a curses, para aplicaciones de terminal?
- 21. ¿Qué es una buena biblioteca de gráficos de red para el lenguaje X?
- 22. una buena biblioteca para calcular sha-256 en C++
- 23. Una buena biblioteca 3D de malla
- 24. Mejor biblioteca de matriz C++ para matrices unitarias dispersas
- 25. ¿Qué es una buena biblioteca de Java para el etiquetado de partes de voz?
- 26. ¿Qué es una buena biblioteca de PHP para manejar cargas de archivos?
- 27. ¿Qué es una buena biblioteca de Python para árboles de decisión?
- 28. ¿Qué es una buena biblioteca para manipular los archivos de configuración de Apache2?
- 29. ¿Qué es una buena biblioteca de visualización de datos para iOS?
- 30. Buena biblioteca liviana para HTTP POST/GET para C?
LAPACK + BLAS obtiene la mayoría de las cosas –