View Single Post
 
 
Old 25/12/2008, 23:50 Reply With Quote   #4
Kiki
Kiki++
 
Kiki's Avatar
 
Join Date: Sep 2005
Posts: 801
Kiki is on a distinguished road
Kiki is offline
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 ...
__________________
Wir haben die Kunst, damit wir nicht an der Wahrheit zugrunde gehen.

Last edited by Kiki : 25/12/2008 at 23:56.