2009-12-06 7 views
15

क्या कोई आईफोन 3 जीएस या पेंडोरा तक पहुंचने वाला कोई व्यक्ति कृपया निम्नलिखित विधानसभा दिनचर्या का परीक्षण कर सकता है जिसे मैंने अभी लिखा था?एआरएमवी 7 + नियॉन के लिए फास्ट साइन/कोसाइन: टेस्टर्स की तलाश में ...

यह नियॉन वेक्टर एफपीयू पर वास्तव में वास्तव में तेजी से साइन इन और कोसाइन की गणना करना है। मुझे पता है कि यह ठीक से संकलित है, लेकिन पर्याप्त हार्डवेयर के बिना मैं इसका परीक्षण नहीं कर सकता। यदि आप केवल कुछ साइन और कोसाइन की गणना कर सकते हैं और परिणामों की तुलना 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" 
    ); 
} 
+0

बस उत्सुक - क्या एल्गोरिथ्म क्या आप पाप की तेजी से गणना करने के लिए उपयोग कर रहे हैं, कॉस? – gahooa

+0

यदि आप एक परीक्षण प्रोग्राम जोड़ते हैं तो मैं इसे अपने बीगलबोर्ड पर चला सकता हूं .. वही सीपीयू। –

+0

@ गहुआ: मैं निकोलस कैपेन्स द्वारा http://www.devmaster.net/forums/showthread.php?t=5784 पर वर्णित विधि का उपयोग करता हूं और तथ्य यह है कि cos (x) = sin (x + 90 °) – jcayzac

उत्तर

10

बस इसे अपने बीगलबोर्ड पर परीक्षण किया .. जैसा कि टिप्पणियों में कहा गया है: वही सीपीयू।

आपका कोड क्लाइब से लगभग 15 गुना तेज है .. ठीक है!

मैंने आपके कार्यान्वयन के प्रत्येक कॉल के लिए 82 चक्र और चार सी-लिब कॉल के लिए 1260 मापा है। ध्यान दें कि मैंने सॉफ्ट-फ्लोट एबीआई और मेरे ओएमएपी 3 के साथ संकलित किया है, प्रारंभिक सिलिकॉन है, इसलिए सी-लिब संस्करण में प्रत्येक कॉल में कम से कम 40 चक्रों की नीयन स्टॉल है।

मैं एक साथ परिणाम ज़िप करने के बाद ..

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

प्रदर्शन-काउंटर सामान सबसे अधिक संभावना iphone पर काम नहीं करेगा।

आशा है कि आप यही खोज रहे हैं।

+0

बहुत बहुत धन्यवाद Nils। मैं थोड़ा आश्चर्यचकित हूं कि यह बॉक्स से बाहर काम करता है, वास्तव में :-) वीएफपी 11 के लिए लागू एक ही विधि केवल मेरे आईपॉड टच पर sinf() + cosf() को कॉल करने के रूप में लगभग दोगुनी है, इसलिए मैंने एक लुकअप टेबल का उपयोग किया बजाय। – jcayzac

+0

आह मैं आपके परीक्षण कार्यक्रम से देखता हूं कि आपने libc फ़ंक्शन (sin()/cos(), sinf()/cosf() नहीं के डबल परिशुद्धता संस्करण का उपयोग किया है। यह बताता है कि क्यों libc फ़ंक्शंस इतनी खराब प्रदर्शन करता है मुझे लगता है :-) – jcayzac

+0

बस संकलित और इसे sinf/cosf के साथ चलाएं, और इससे कोई फर्क नहीं पड़ता है। –

3

ओह - इससे पहले कि मैं इसे भूल जाओ: हो सकता है कि आप सुरक्षित अपने आप को काम का एक सा ..

इन नियोन अनुकूलित गणित कार्यों पर एक नजर डालें कर सकते हैं:

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

+0

हां मैं इन कार्यों को जानता हूं। काश मैं नीयन के साथ खेलने के लिए एक आईफोन 3 जीएस था, जो निश्चित रूप से मेरे आईपॉड के वीएफपी 11 पर काम करने से ज्यादा मजेदार है। आईफोन के साथ एक एफपीयू सनक शुरू हुआ, लेकिन इससे पहले नियम था: फ्लोट न करें, निश्चित बिंदु करें।मुझे लगता है कि आईफोन के लिए फ्लोट्स के साथ कोडिंग करने वाले लोग गलत हैं। एआरएम पूर्णांक के साथ वास्तव में अच्छा है, और फ्लोट रजिस्टरों की स्थापना एक बड़ा ओवरहेड है। – jcayzac

+0

वास्तव में मैं एक और संबंधित परियोजना जानता हूं, यह नहीं। जो मुझे दिमाग में था वह केवल मैट्रिक्स/वेक्टर फ़ंक्शन था। बस उस व्यक्ति को चेक करें जिस पर आपने लिंक डाला है। ऐसा लगता है कि इसमें सभी गणित हैं। फ़ंक्शन! मैं इसे अभिनीत कर रहा हूँ, धन्यवाद! :-) – jcayzac

संबंधित मुद्दे