hehehe ... mo nimbrung ... bikin fungsi logaritma pake SSE, masalahnya :
1. nggak gitu akurat, maklum cuma evaluasi maclaurin series cuma 4 suku saja
2. Only work for x where 0 < x < 2 (open interval)
3. No guarantee it is faster
ini kodenya :
Code:
#include <cstdio>
#include <cmath>
#include <xmmintrin.h>
float maclaurin(float val){
__declspec(align(16) ) float tmp[4] = { 1.0F,1.0F,1.0F,0.0F};
__declspec(align(16) ) float multiplier[4] = { 1.0F,-0.5F,0.33333333F,-0.25F};
tmp[3] = val;
__m128 vec1 = _mm_load_ps(tmp);
__m128 vec2 = _mm_shuffle_ps( vec1,vec1,0xF4);
__m128 vec3 = _mm_shuffle_ps( vec1,vec1,0xFC);
__m128 vec4 = _mm_shuffle_ps( vec1,vec1,0xFF);
__m128 acc = _mm_mul_ps(vec1, vec2);
acc = _mm_mul_ps(acc, vec3);
vec1 = _mm_load_ps(multiplier);
acc = _mm_mul_ps(acc, vec4);
acc = _mm_mul_ps(acc,vec1);
vec1 = _mm_shuffle_ps(acc,acc, 0xE4);
vec2 = _mm_shuffle_ps(acc,acc, 0x39);
vec3 = _mm_shuffle_ps(acc,acc, 0x4E);
vec4 = _mm_shuffle_ps(acc,acc, 0x93);
acc = _mm_add_ps(vec1,vec2);
acc = _mm_add_ps( acc, vec3);
acc = _mm_add_ps(acc, vec4);
float res;
_mm_store_ss(&res,acc);
return res;
}
float my_log(float x){
return maclaurin(x - 1);
}
int main(){
float reference = logf(1.3F);
float target = my_log(1.3F);
printf(" reference = %g , target = %g\n", reference, target);
}
di komputer gw, outputnya :
reference = 0.262364 , target = 0.261975
not bad ...
