Skip to content

Instantly share code, notes, and snippets.

@nattoheaven
Created May 19, 2014 23:39
Show Gist options
  • Save nattoheaven/e7c67a2abef884b8319c to your computer and use it in GitHub Desktop.
Save nattoheaven/e7c67a2abef884b8319c to your computer and use it in GitHub Desktop.
Test for Precision with Vectorization
#include <stdio.h>
#include <xmmintrin.h>
int
main()
{
int i;
float fi;
union {
int i;
float f;
} sum;
__m128 vi, vsum, vinc;
vinc = _mm_set1_ps(0.04f);
sum.f = 0.0f;
fi = 0.01f;
for (i = 0; i < 100; i++) {
sum.f += fi;
fi += 0.01f;
}
printf("From 1 to 100:\t%f (%08x.)\n", sum.f, sum.i);
sum.f = 0.0f;
fi = 1.0f;
for (i = 0; i < 100; i++) {
sum.f += fi;
fi -= 0.01f;
}
printf("From 100 to 1:\t%f (%08x.)\n", sum.f, sum.i);
vsum = _mm_setzero_ps();
vi = _mm_set_ps(0.01f, 0.02f, 0.03f, 0.04f);
for (i = 0; i < 100 / 4; i++) {
vsum = _mm_add_ps(vsum, vi);
vi = _mm_add_ps(vi, vinc);
}
vsum = _mm_add_ps(_mm_unpacklo_ps(vsum ,vsum),
_mm_unpackhi_ps(vsum ,vsum));
vsum = _mm_add_ps(_mm_unpacklo_ps(vsum ,vsum),
_mm_unpackhi_ps(vsum ,vsum));
_mm_store1_ps(&sum.f, vsum);
printf("SIMD incre:\t%f (%08x.)\n", sum.f, sum.i);
vsum = _mm_setzero_ps();
vi = _mm_set_ps(1.0f, 0.99f, 0.98f, 0.97f);
for (i = 0; i < 100 / 4; i++) {
vsum = _mm_add_ps(vsum, vi);
vi = _mm_sub_ps(vi, vinc);
}
vsum = _mm_add_ps(_mm_unpacklo_ps(vsum ,vsum),
_mm_unpackhi_ps(vsum ,vsum));
vsum = _mm_add_ps(_mm_unpacklo_ps(vsum ,vsum),
_mm_unpackhi_ps(vsum ,vsum));
_mm_store1_ps(&sum.f, vsum);
printf("SIMD decre:\t%f (%08x.)\n", sum.f, sum.i);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment