ARMV7+네온을위한 빠른 사인/코사인 : 테스터를 찾고…
-
13-09-2019 - |
문제
iPhone 3GS 또는 Pandora에 액세스 할 수있는 사람이 방금 쓴 다음 어셈블리 루틴을 테스트 할 수 있습니까?
그것은 네온 벡터 FPU에서 죄와 코사인을 정말로 빠르게 계산해야합니다. 나는 그것이 잘 컴파일한다는 것을 알고 있지만 적절한 하드웨어가 없으면 테스트 할 수 없습니다. 몇 가지 사인과 코사인을 계산하고 결과를 sinf () 및 cosf ()의 결과와 비교할 수 있다면 실제로 도움이 될 것입니다.
감사!
#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"
);
}
해결책
의견에서 말했듯이 내 비글 보드에서 테스트했습니다. 동일한 CPU.
귀하의 코드는 Clib보다 약 15 배 빠릅니다. 잘했습니다!
구현의 각 호출마다 82주기를 측정했으며 4 개의 C-LIB 호출에 대해 1260을 측정했습니다. Soft-Float ABI로 컴파일했으며 OMAP3는 초기 실리콘이므로 C-LIB 버전으로의 각 호출에는 40 회 이상의 NEON 스톨이 있습니다.
결과를 함께 줄였습니다 ..
http://torus.untergrund.net/code/sincos.zip
Performance Counter 물건은 iPhone에서 작동하지 않을 가능성이 높습니다.
그것이 당신이 찾고 있던 것이기를 바랍니다.
다른 팁
오 - 잊기 전에 : 어쩌면 당신은 약간의 일을 안전하게 할 수 있습니다 ..
이 네온 최적화 된 수학 기능을 살펴보십시오.
제휴하지 않습니다 StackOverflow