/* * Code largement inspire du site * http://www.codeproject.com/KB/recipes/sseintro.aspx * * NB : Le source doit *absolument* etre compile avec l'option -msse * sinon on a un message disant qu'on doit autoriser les instructions * SSE et MMX (messages generes parce que __SSE__ et __MMX__ ne sont * pas definis). */ #include #include #include #include "size.h" /* * All SSE instructions and __m128 data type are defined in xmmintrin.h file. * Since SSE instructions are compiler intrinsics and not functions, there * are no lib-files. */ #include void computeResult( float* pArray1, // [in] first source array float* pArray2, // [in] second source array float* pResult, // [out] result array int nSize) // [in] size of all arrays { int nLoop = nSize/ 4; int i; __m128 m1, m2, m3, m4; __m128* pSrc1 = (__m128*) pArray1; __m128* pSrc2 = (__m128*) pArray2; __m128* pDest = (__m128*) pResult; __m128 m0_5 = _mm_set_ps1(0.5f); // m0_5[0, 1, 2, 3] = 0.5 for ( i = nLoop; i > 0; 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++; } } int main(int argc, char *argv[]) { float pArray1[SIZE] __attribute__ ((aligned (16))); float pArray2[SIZE] __attribute__ ((aligned (16))); float pResult[SIZE] __attribute__ ((aligned (16))); int i; printf("Debut des calculs...\n"); printf("\tpArray1 = %p\n\tpArray2 = %p\n\tpResult = %p\n", pArray1, pArray2, pResult); for (i=NB_TIMES; i>0; i--) { computeResult(pArray1, pArray2, pResult, SIZE); } printf("...Fin des calculs\n"); return EXIT_SUCCESS; }