Pregunta

Estoy utilizando ampliamente las matemáticas 3D en mi aplicación.¿Cuánta velocidad puedo lograr al convertir mi biblioteca vectorial/matriz a SSE, AltiVec o un código SIMD similar?

¿Fue útil?

Solución

En mi experiencia, normalmente veo una mejora de 3 veces al llevar un algoritmo de x87 a SSE, y una mejor mejora de 5 veces al pasar a VMX/Altivec (debido a problemas complicados que tienen que ver con la profundidad del proceso, la programación, etc.).Pero normalmente sólo hago esto en los casos en los que tengo cientos o miles de números con los que operar, no en aquellos en los que estoy haciendo un vector a la vez ad hoc.

Otros consejos

Esa no es toda la historia, pero es posible obtener más optimizaciones usando SIMD, eche un vistazo a la presentación de Miguel sobre cuando implementó instrucciones SIMD con MONO que realizó en CDP 2008,

SIMD beats doubles' ass in this particular configuration.
(fuente: tirania.org)

Imagen de la entrada del blog de Miguel.

Para algunos números muy aproximados:He escuchado a algunas personas en ompf.org Reclame aceleraciones 10 veces mayores para algunas rutinas de trazado de rayos optimizadas manualmente.También he tenido algunas buenas aceleraciones.Calculo que obtuve entre 2 y 6 veces en mis rutinas dependiendo del problema, y ​​muchas de ellas tenían un par de tiendas y cargas innecesarias.Si tiene una gran cantidad de ramificaciones en su código, olvídelo, pero para problemas que son naturalmente paralelos a los datos, puede hacerlo bastante bien.

Sin embargo, debo agregar que sus algoritmos deben diseñarse para la ejecución de datos en paralelo.Esto significa que si tiene una biblioteca matemática genérica como mencionó, entonces debería tomar vectores empaquetados en lugar de vectores individuales o simplemente estará perdiendo el tiempo.

P.ej.Algo como

namespace SIMD {
class PackedVec4d
{
  __m128 x;
  __m128 y;
  __m128 z;
  __m128 w;

  //...
};
}

La mayoría de los problemas donde el rendimiento importa se puede paralelizar ya que lo más probable es que trabaje con un gran conjunto de datos.Su problema me parece un caso de optimización prematura.

Para operaciones 3D, tenga cuidado con los datos no inicializados en su componente W.He visto casos en los que las operaciones SSE (_mm_add_ps) tardarían 10 veces el tiempo normal debido a datos incorrectos en W.

La respuesta depende en gran medida de lo que esté haciendo la biblioteca y de cómo se utilice.

Las ganancias pueden ir desde unos pocos puntos porcentuales hasta "varias veces más rápido", las áreas más susceptibles de ver ganancias son aquellas en las que no se trata de vectores o valores aislados, sino de múltiples vectores o valores que deben procesarse en el mismo camino.

Otra área es cuando se alcanzan los límites de memoria caché o memoria, lo que, nuevamente, requiere que se procesen muchos valores/vectores.

Los dominios donde las ganancias pueden ser más drásticas son probablemente los del procesamiento de imágenes y señales, las simulaciones computacionales y las operaciones matemáticas generales en 3D en mallas (en lugar de vectores aislados).

Hoy en día, todos los buenos compiladores para x86 generan instrucciones SSE para matemáticas flotantes SP y DP de forma predeterminada.Casi siempre es más rápido utilizar estas instrucciones que las nativas, incluso para operaciones escalares, siempre que las programe correctamente.Esto sorprenderá a muchos, que en el pasado consideraban que SSE era "lento" y pensaban que los compiladores no podían generar instrucciones escalares SSE rápidas.Pero ahora, debe usar un interruptor para desactivar la generación SSE y usar x87.Tenga en cuenta que x87 está efectivamente obsoleto en este momento y puede eliminarse por completo de procesadores futuros.El único punto negativo de esto es que podemos perder la capacidad de hacer flotar DP de 80 bits en el registro.Pero el consenso parece ser que si depende de flotadores DP de 80 bits en lugar de 64 bits para la precisión, debería buscar un algoritmo más preciso y tolerante a pérdidas.

Todo lo anterior fue una completa sorpresa para mí.Es muy contrario a la intuición.Pero los datos hablan.

Lo más probable es que solo veas una aceleración muy pequeña, si es que la hay, y el proceso será más complicado de lo esperado.Para más detalles ver La clase vectorial ubicua SSE Artículo de Fabián Giesen.

La clase de vector SSE ubicuo:Desmentir un mito común

No es tan importante

En primer lugar, su clase vectorial probablemente no sea tan importante para el rendimiento de su programa como cree (y si lo es, es más probable que esté haciendo algo mal que porque los cálculos sean ineficientes).No me malinterpretes, probablemente será una de las clases más utilizadas en todo tu programa, al menos al hacer gráficos 3D.Pero el hecho de que las operaciones vectoriales sean comunes no significa automáticamente que dominarán el tiempo de ejecución de su programa.

No tan caliente

No es fácil

Ahora no

Jamas

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