Pregunta

Quiero migrar un pedazo de código que implica una serie de vector y matriz de cálculos a C o C++, con el objetivo de acelerar el código tanto como sea posible.

Son cálculos de álgebra lineal con for bucles en C código tan rápido como los cálculos utilizando LAPACK/BLAS, o hay algún única de aceleración de uso de las bibliotecas?

En otras palabras, podría sencillo código C (usando for bucles y similares) realizar cálculos de álgebra lineal tan rápido como el código que utiliza LAPACK/BLAS?

¿Fue útil?

Solución

Proveedor LAPACK / BLAS bibliotecas (Intel IPP/MKL han sido mencionados, pero también hay de AMD lmc atípica, y otros de la CPU proveedores como IBM/Potencia o de Oracle/SPARC proporcionar equivalentes) son a menudo altamente optimizado para CPU específica de habilidades que va a aumentar de manera significativa el rendimiento en grandes los conjuntos de datos.

A menudo, sin embargo, tienes muy específicos pequeños datos para operar (por ejemplo, matrices de 4x4 o 4D productos de puntos, es decir,operaciones utilizadas en la geometría 3D de procesamiento) y para ese tipo de cosas, BLAS/LAPACK son una exageración, porque de las pruebas iniciales hechas por estas subrutinas que codepaths para elegir, dependiendo de las propiedades del conjunto de datos.En esas situaciones, simple C/C++ código fuente, tal vez usando SSE2...4 características intrínsecas y/o generado por el compilador de vectorización, puede vencer a BLAS/LAPACK.
Es por eso que, por ejemplo, Intel tiene dos bibliotecas - MKL para grandes linear algebra de conjuntos de datos, y el IPP para pequeño (gráficos de vectores) conjuntos de datos.

En ese sentido,

  • ¿qué es exactamente el conjunto de datos ?
  • Lo de la matriz por vector de tamaños ?
  • Lo que las operaciones de álgebra lineal ?

También, con respecto a "simple para bucles":Dar el compilador la oportunidad de vectorización para usted.I. e.algo así como:

for (i = 0; i < DIM_OF_MY_VECTOR; i += 4) {
    vecmul[i] = src1[i] * src2[i];
    vecmul[i+1] = src1[i+1] * src2[i+1];
    vecmul[i+2] = src1[i+2] * src2[i+2];
    vecmul[i+3] = src1[i+3] * src2[i+3];
}
for (i = 0; i < DIM_OF_MY_VECTOR; i += 4)
    dotprod += vecmul[i] + vecmul[i+1] + vecmul[i+2] + vecmul[i+3];

podría ser una mejor alimentación para un vectorizar compilador de la llanura

for (i = 0; i < DIM_OF_MY_VECTOR; i++) dotprod += src1[i]*src2[i];

expresión.En algunos aspectos, lo que significa cálculos con bucles va a tener un impacto significativo.
Si su vector de dimensiones lo suficientemente grandes, sin embargo, la BLAS versión,

dotprod = CBLAS.ddot(DIM_OF_MY_VECTOR, src1, 1, src2, 1);

será un código más limpio y probablemente más rápido.

En la referencia de lado, estos podrían ser de interés:

Otros consejos

Probablemente no.La gente es un poco de trabajo para asegurar que lapack/BLAS rutinas optimizadas y numéricamente estable.Mientras que el código es a menudo algo en el complejo lado, normalmente de esa manera por una razón.

Dependiendo de tu objetivo(s), es posible que desee buscar en el Intel Math Kernel Library.Al menos, si usted está apuntando a los procesadores Intel, es probablemente el más rápido vas a encontrar.

El análisis numérico es duro.Al menos, debe ser íntimamente conscientes de las limitaciones de aritmética de punto flotante, y saber cómo la secuencia de las operaciones para equilibrar la velocidad con la estabilidad numérica.Esto no es trivial.

Usted necesita realmente para tener alguna pista sobre el equilibrio entre la velocidad y la estabilidad que necesita realmente.En general, el desarrollo de software, optimización prematura es la raíz de todos los males.En el análisis numérico, es el nombre del juego.Si usted no consigue el equilibrio correcto la primera vez, usted tendrá que volver a escribir más o menos todo.

Y se hace más difícil cuando se intenta adaptar álgebra lineal pruebas en los algoritmos.Usted necesita para realmente entender el álgebra, por lo que puede refactorizar en un establo (o lo suficientemente estable) algoritmo.

Si yo fuera usted, me gustaría objetivo de la LAPACK/BLAS de la API y alrededor de la tienda para la biblioteca que funciona para el conjunto de datos.

Usted tiene un montón de opciones:LAPACK/BLAS, GSL y otros auto-optimización de las bibliotecas, vender las bibliotecas.

Yo no cumplir con este bibliotecas muy bien.Pero usted debería considerar la posibilidad de que las bibliotecas suelen hacer un par de pruebas en los parámetros, que tienen un "sistema de comunicación" para los errores, e incluso la atribución de nuevas variables cuando se llama a una función...Si el calcs son triviales, tal vez usted puede tratar de hacerlo por ti mismo, adaptating con sus necesidades...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top