Tema 5: El Pentium a Fondo - DAC
Tema 5: El Pentium a Fondo - DAC Tema 5: El Pentium a Fondo - DAC
float* Vector1, Vector2, Resultado; int dimension = 100; for (int i = 0; i < dimension; i++ ) { } *Resultado = (float)sqrt((*Vector1) * (*Vector1) + (*Vector2) * (*Vector2)) + 0.5f; Vector1++; Vector2++; Resultado++; Código adaptado de: http://www.codeproject.com/KB/recipes/sseint ro.aspx SSE: Ejemplo MICROPROCESADORES float* Vector1, Vector2, Resultado; int dimension = 100; int n_iter = dimension/ 4; __m128 m1, m2, m3, m4; __m128* pSrc1 = (__m128*) Vector1; __m128* pSrc2 = (__m128*) Vector2; __m128* pDest = (__m128*) Resultado; __m128 m0_5 = _mm_set_ps1(0.5f); // m0_5[0, 1, 2, 3] = 0.5 for ( int i = 0; i < n_iter; i++ ) { m1 = _mm_mul_ps(*pSrc1, *pSrc1); // m1 = *pSrc1 * *pSrc1 m2 = _mm_mul_ps(*pSrc2, *pSrc2); // m2 = *pSrc2 * *pSrc2 m3 = _mm_add_ps(m1, m2); // m3 = m1 + m2 m4 = _mm_sqrt_ps(m3); // m4 = sqrt(m3) *pDest = _mm_add_ps(m4, m0_5); // *pDest = m4 + 0.5 } pSrc1++; pSrc2++; pDest++; ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA INFORMÁTICA 22
Práctica 2 MICROPROCESADORES • Optimización mediante extensiones MMX • Segunda práctica obligatoria. • Práctica por parejas. • Campus Virtual: Enunciado. Material de apoyo. Ejemplos de código. Fechas de entrega. • Se os dará un código ya hecho, que debéis optimizar utilizando extensiones SIMD y cualquier otro tipo de optimización bien documentada. • Si se detecta copia ¡Suspensa toda la convocatoria! ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA INFORMÁTICA 23
- Page 1 and 2: MICROPROCESADORES Tema 5: El Pentiu
- Page 3 and 4: Contenidos Análisis de Rendimiento
- Page 5 and 6: Contenidos Sampling Wizard MICROPRO
- Page 7 and 8: Call Graph MICROPROCESADORES • VT
- Page 9 and 10: Desenrollado de bucles MICROPROCESA
- Page 11 and 12: • Bucle sin desenrollar: Contenid
- Page 13 and 14: Otros consejos de Optimización MIC
- Page 15 and 16: Intrinsics MICROPROCESADORES • Fu
- Page 17 and 18: MMX: Funciones Lógicas y de Bit MI
- Page 19 and 20: MMX: Otras Funciones MICROPROCESADO
- Page 21: • SSE: #include “xmmintrin.h
float* Vector1, Vector2, Resultado;<br />
int dimension = 100;<br />
for (int i = 0; i < dimension; i++ )<br />
{<br />
}<br />
*Resultado = (float)sqrt((*Vector1) *<br />
(*Vector1) + (*Vector2) * (*Vector2)) + 0.5f;<br />
Vector1++;<br />
Vector2++;<br />
Resultado++;<br />
Código adaptado de:<br />
http://www.codeproject.com/KB/recipes/sseint<br />
ro.aspx<br />
SSE: Ejemplo<br />
MICROPROCESADORES<br />
float* Vector1, Vector2, Resultado;<br />
int dimension = 100;<br />
int n_iter = dimension/ 4;<br />
__m128 m1, m2, m3, m4;<br />
__m128* pSrc1 = (__m128*) Vector1;<br />
__m128* pSrc2 = (__m128*) Vector2;<br />
__m128* pDest = (__m128*) Resultado;<br />
__m128 m0_5 = _mm_set_ps1(0.5f); // m0_5[0, 1, 2, 3] = 0.5<br />
for ( int i = 0; i < n_iter; i++ )<br />
{<br />
m1 = _mm_mul_ps(*pSrc1, *pSrc1); // m1 = *pSrc1 * *pSrc1<br />
m2 = _mm_mul_ps(*pSrc2, *pSrc2); // m2 = *pSrc2 * *pSrc2<br />
m3 = _mm_add_ps(m1, m2); // m3 = m1 + m2<br />
m4 = _mm_sqrt_ps(m3); // m4 = sqrt(m3)<br />
*pDest = _mm_add_ps(m4, m0_5); // *pDest = m4 + 0.5<br />
}<br />
pSrc1++;<br />
pSrc2++;<br />
pDest++;<br />
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA<br />
INFORMÁTICA<br />
22