Szybki Sinus / Cosinus do ARMv7 + NEON: Szukam testerów…

Czy ktoś z dostępem do iPhone ' a 3GS lub Pandory może przetestować poniższy schemat montażu, który właśnie napisałem?

Ma bardzo szybko obliczać sinusy i cosiny na wektorze FPU. Wiem, że dobrze się komponuje, ale bez odpowiedniego sprzętu nie mogę go przetestować. Gdybyś mógł po prostu obliczyć kilka sinus i cosinus i porównać wyniki z sinf() i cosf () to naprawdę by pomogło.

Dzięki!
#include <math.h>

/// Computes the sine and cosine of two angles
/// in: angles = Two angles, expressed in radians, in the [-PI,PI] range.
/// out: results = vector containing [sin(angles[0]),cos(angles[0]),sin(angles[1]),cos(angles[1])]
static inline void vsincos(const float angles[2], float results[4]) {
    static const float constants[]  = { 
    /* q1 */  0,                M_PI_2,           0,                M_PI_2,
    /* q2 */  M_PI,             M_PI,             M_PI,             M_PI,
    /* q3 */  4.f/M_PI,         4.f/M_PI,         4.f/M_PI,         4.f/M_PI,
    /* q4 */ -4.f/(M_PI*M_PI), -4.f/(M_PI*M_PI), -4.f/(M_PI*M_PI), -4.f/(M_PI*M_PI),
    /* q5 */  2.f,              2.f,              2.f,              2.f,
    /* q6 */  .225f,            .225f,            .225f,            .225f
    };  
    asm volatile(
        // Load q0 with [angle1,angle1,angle2,angle2]
        "vldmia %1, { d3 }\n\t"
        "vdup.f32 d0, d3[0]\n\t"
        "vdup.f32 d1, d3[1]\n\t"
        // Load q1-q6 with constants
        "vldmia %2, { q1-q6 }\n\t"
        // Cos(x) = Sin(x+PI/2), so
        // q0 = [angle1, angle1+PI/2, angle2, angle2+PI/2]
        "vadd.f32 q0,q0,q1\n\t"
        // if angle1+PI/2>PI, substract 2*PI
        // q0-=(q0>PI)?2*PI:0
        "vcge.f32 q1,q0,q2\n\t"
        "vand.f32 q1,q1,q2\n\t"
        "vmls.f32 q0,q1,q5\n\t"
        // q0=(4/PI)*q0 - q0*abs(q0)*4/(PI*PI)
        "vabs.f32 q1,q0\n\t"
        "vmul.f32 q1,q0,q1\n\t"
        "vmul.f32 q0,q0,q3\n\t"
        "vmul.f32 q1,q1,q4\n\t"
        "vadd.f32 q0,q0,q1\n\t"
        // q0+=.225*(q0*abs(q0) - q0)
        "vabs.f32 q1,q0\n\t"
        "vmul.f32 q1,q0,q1\n\t"
        "vsub.f32 q1,q0\n\t"
        "vmla.f32 q0,q1,q6\n\t"
        "vstmia %0, { q0 }\n\t"
        :: "r"(results), "r"(angles), "r"(constants)
        : "memory","cc","q0","q1","q2","q3","q4","q5","q6"
    );  
}
Author: jcayzac, 2009-12-06

2 answers

Właśnie przetestowałem to na mojej beagleboard.. Jak wspomniano w komentarzach: ten sam procesor.

Twój kod jest około 15 razy szybszy niż clib.. Dobra robota!

Zmierzyłem 82 cykle dla każdego wywołania Twojej implementacji i 1260 dla czterech wywołań c-lib. Zauważ, że skompilowałem z soft-float ABI i mój OMAP3 to wczesny silikon, więc każde wywołanie do wersji c-lib ma Neon co najmniej 40 cykli.

Zebrałem wyniki..

Http://torus.untergrund.net/code/sincos.zip

Licznik wydajności najprawdopodobniej nie zadziała na iPhonie.

Mam nadzieję, że tego właśnie szukałeś.

 10
Author: Nils Pipenbrinck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-06 20:12:32

Och-zanim zapomnę: może uda Ci się zabezpieczyć trochę pracy..

Spójrz na te neonowe funkcje matematyczne:

Http://code.google.com/p/math-neon/

 3
Author: Nils Pipenbrinck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-06 20:16:05