Tema 5: El Pentium a Fondo - DAC

Tema 5: El Pentium a Fondo - DAC Tema 5: El Pentium a Fondo - DAC

dac.escet.urjc.es
from dac.escet.urjc.es More from this publisher
09.05.2013 Views

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

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!