2010-12-30 7 views

Respuesta

5

Busque en Eigen. Debería tener todo lo que necesita.

+0

¿Utiliza hilos (si no, no es rápido)? – Yttrill

+0

Eigen solo es bueno en matrices pequeñas. No usa hilos para matrices más grandes. Pero usa SSE2 cuando está disponible. –

+0

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

3

He tenido una buena experiencia con Boost uBLAS. Es una buena opción si ya estás usando Boost.

+0

¿Utiliza hilos (si no es rápido)? – Yttrill

+2

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. –

+0

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. –

1

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

http://www.quantcode.com/modules/smartfaq/faq.php?faqid=33

+0

¿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

+0

http://math-atlas.sourceforge.net/errata.html# gccCrazy –

-1

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.

+3

Nunca implemente las operaciones de la matriz usted mismo. Use una implementación BLAS. –

1

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)

GdiPlus Matrix Documentation

6

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.

7

FWIW, Eigen 3 utiliza subprocesos (OpenMP) para productos de matriz (en respuesta a la instrucción anterior acerca de que Eigen no usa subprocesos).

Cuestiones relacionadas