Saltar al contenido

Acelerar la matriz flotante 5×5 * multiplicación de vectores con SSE

Entiende el código de forma correcta previamente a adaptarlo a tu proyecto y si tdeseas aportar algo puedes compartirlo con nosotros.

Solución:

La biblioteca de plantillas Eigen C++ para vectores, matrices, … tiene ambos

  • código optimizado para matrices pequeñas de tamaño fijo (así como de tamaño dinámico)

  • código optimizado que usa optimizaciones SSE

así que deberías intentarlo.

En principio, la aceleración podría ser 4 veces con SSE (8 veces con AVX). Dejame explicar.

Llamemos a su matriz fija de 5×5 METRO. Definiendo los componentes de un vector 5D como (x,y,z,w,t). Ahora forma una matriz de 5×4 tu de los cuatro primeros vectores.

U =
xxxx
yyyy
zzzz
wwww
tttt

A continuación, haz el producto de matrices. UM = V. La matriz V contiene el producto de METRO y los cuatro primeros vectores. El único problema es que para SSE necesitamos leer en las filas de tu pero en la memoria tu se almacena como xyzwtxyzwtxyzwtxyzwt así que tenemos que transponerlo a xxxxyyyyzzzzwwwwtttt. Esto se puede hacer con mezclas/mezclas en SSE. Una vez que tenemos este formato, el producto matriz es muy eficiente.

En lugar de realizar operaciones O(5x5x4) con código escalar, solo requiere operaciones O(5×5), es decir, una aceleración de 4x. Con AVX la matriz tu será 5×8, por lo que en lugar de realizar operaciones O(5x5x8), solo grava O(5×5), es decir, una aceleración de 8x.

La matriz Vsin embargo, estará en xxxxyyyyzzzzwwwwtttt formato, por lo que, según la aplicación, es posible que deba transponerse a xyzwtxyzwtxyzwtxyzwt formato.

Repita esto para los siguientes cuatro vectores (8 para AVX) y así sucesivamente hasta que termine.

Si tiene control sobre los vectores, por ejemplo, si su aplicación genera los vectores sobre la marcha, puede generarlos en xxxxyyyyzzzzwwwwtttt formato y evitar la transposición del array. En ese caso, debería obtener una aceleración de 4x con SSE y de 8x con AVX. Si combina esto con subprocesos, por ejemplo, OpenMP, su aceleración debería estar cerca de 16x (suponiendo cuatro núcleos físicos) con SSE. Creo que eso es lo mejor que puedes hacer con SSE.

Editar: debido al paralelismo de nivel de instrucción (ILP), puede obtener otro factor de 2 en la aceleración, por lo que la aceleración para SSE podría 32x con cuatro núcleos (64x AVX) y nuevamente otro factor de 2 con Haswell debido a FMA3.

Sugeriría usar Intel IPP y abstraerse de la dependencia de las técnicas.

valoraciones y reseñas

Si guardas algún recelo y forma de desarrollar nuestro enunciado puedes escribir una aclaración y con mucho gusto lo ojearemos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *