2010-07-13 10 views
13

जीसीसी द्वारा प्रदान किए गए मल्टीप्ली-संचित इंट्रिनिक्स का उपयोग कैसे करें?एआरएम कॉर्टेक्स-ए 8 में गुणा और संचित इंट्रिनिक्स का उपयोग कैसे करें?

float32x4_t vmlaq_f32 (float32x4_t , float32x4_t , float32x4_t); 

क्या कोई इस बात को समझा सकता है कि मुझे इस फ़ंक्शन में किन तीन पैरामीटर पास करना है। मेरा मतलब है स्रोत और गंतव्य रजिस्टर और फ़ंक्शन क्या देता है?

सहायता !!!

+6

जीसीसी दस्तावेज़ (और जीसीसी इंट्रिनिक्स पर आधारित अंतर्दृष्टि के लिए वास्तविक दृश्य दस्तावेज़) बहुत स्पष्ट हैं ... यदि आपको कोई सभ्य उत्तर नहीं मिलता है, तो मैं बस एक संकलन करने का सुझाव दूंगा कुछ कॉल और उत्पादन के असेंबली पर एक नज़र डालने। इससे आपको एक बहुत अच्छा विचार मिलना चाहिए (भले ही यह जाने का आदर्श तरीका है)। –

उत्तर

19

सीधे शब्दों में कहा vmla अनुदेश निम्नलिखित है:

struct 
{ 
    float val[4]; 
} float32x4_t 


float32x4_t vmla (float32x4_t a, float32x4_t b, float32x4_t c) 
{ 
    float32x4 result; 

    for (int i=0; i<4; i++) 
    { 
    result.val[i] = b.val[i]*c.val[i]+a.val[i]; 
    } 

    return result; 
} 

और यह सब एक झुलसाना कोडांतरक अनुदेश :-)

आप के बीच इस नियोन-कोडांतरक आंतरिक उपयोग कर सकते हैं में संकलित 3 डी-ग्राफिक्स के लिए सामान्य 4x4 मैट्रिक्स गुणाओं में अन्य चीजें इस तरह:

float32x4_t transform (float32x4_t * matrix, float32x4_t vector) 
{ 
    /* in a perfect world this code would compile into just four instructions */ 
    float32x4_t result; 

    result = vml (matrix[0], vector); 
    result = vmla (result, matrix[1], vector); 
    result = vmla (result, matrix[2], vector); 
    result = vmla (result, matrix[3], vector); 

    return result; 
} 

यह कुछ चक्र बचाता है क्योंकि आपको गुणा के बाद परिणाम जोड़ने की ज़रूरत नहीं है। अतिरिक्तता का उपयोग अक्सर किया जाता है जो इन दिनों बहुसंख्यक एचएसए मुख्यधारा बन जाता है (यहां तक ​​कि x86 ने उन्हें हाल ही में एसएसई निर्देश सेट में जोड़ा है)।

इसके अलावा उल्लेखनीय मूल्य: बहुत रैखिक बीजगणित और डीएसपी (डिजिटल सिग्नल प्रोसेसिंग) अनुप्रयोगों में आम हैं। एआरएम बहुत स्मार्ट था और कॉर्टेक्स-ए 8 नीयन-कोर के अंदर फास्ट-पथ लागू किया गया था। यह फास्ट-पथ तब चलता है जब वीएमएलए निर्देश का पहला तर्क (संचयक) पिछले वीएमएल या वीएमएलए निर्देश का परिणाम होता है। मैं विस्तार से जा सकता हूं लेकिन संक्षेप में ऐसी निर्देश श्रृंखला एक वीएमएल/वीएडीडी/वीएमएल/वीएडीडी श्रृंखला से चार गुना तेजी से चलती है।

मेरे सरल मैट्रिक्स पर एक नज़र डालें- गुणा करें: मैंने बिल्कुल यही किया। इस फास्ट-पथ के कारण यह VML और VMLA के बजाय ADD का उपयोग करके लिखित कार्यान्वयन की तुलना में लगभग चार गुना तेज होगा।

+0

इस तरह के विस्तृत उत्तर के लिए धन्यवाद। आपका उत्तर न केवल निर्देश की कार्यक्षमता बताता है बल्कि इस निर्देश का उपयोग करने के लिए पेशेवरों और विपक्ष को भी बताता है। – HaggarTheHorrible

+0

हाय निल्स, मुझे समझ में आया कि एनईओएन निर्देशों का उपयोग करके मैट्रिक्स गुणा को कैसे बढ़ाया जा सकता है। यह वास्तव में नशे की लत है :) मैं एक मैट्रिक्स के विपरीत करने के लिए एनईओएन निर्देशों का उपयोग करना चाहता हूं, क्या आप मुझे कुछ अच्छे दस्तावेजों पर इंगित कर सकते हैं जो बताते हैं कि एक मैट्रिक्स को करने के लिए एनईओएन निर्देशों का उपयोग कैसे करें या आप मुझे कोई विचार कैसे दे सकते हैं इसके बारे में जाने के लिए? धन्यवाद। मैट्रिक्स उलटा के लिए – HaggarTheHorrible

+1

मैं "एसएस मैट्रिक्स इनवर्क्स" पर एक Google खोज करता हूं और एसईओ कोड को नीयन को पोर्ट करता हूं। सामान्य मैट्रिक्स (4x4) के विपरीत उलटी गणना करना सामान्य तरीका है क्रैमर नियम के माध्यम से। –

8

vmlaq_f32 के लिए Google'd, the reference for the RVCT compiler tools चालू हुआ। यहाँ यह क्या कहते है:

Vector multiply accumulate: vmla -> Vr[i] := Va[i] + Vb[i] * Vc[i] 
... 
float32x4_t vmlaq_f32 (float32x4_t a, float32x4_t b, float32x4_t c); 

और

निम्नलिखित प्रकार वैक्टर प्रतिनिधित्व करने के लिए परिभाषित कर रहे हैं। नियोन वेक्टर डेटा प्रकार निम्नलिखित पैटर्न के अनुसार नाम हैं: < प्रकार > < आकार गलियों की > एक्स < संख्या > उदाहरण के लिए _t, int16x4_t एक वेक्टर चार गलियों प्रत्येक एक हस्ताक्षरित 16-बिट पूर्णांक युक्त युक्त है। तालिका ई .1 वेक्टर डेटा प्रकार सूचीबद्ध करता है।

IOW, समारोह से वापसी मान 4 32-बिट तैरता युक्त एक सदिश हो जाएगा, और वेक्टर के प्रत्येक तत्व b और c की इसी तत्व गुणा, और a की सामग्री को जोड़कर की जाती है।

HTH

1
result = vml (matrix[0], vector); 
result = vmla (result, matrix[1], vector); 
result = vmla (result, matrix[2], vector); 
result = vmla (result, matrix[3], vector); 

यह अनुक्रम काम नहीं करेगा, हालांकि।

result.x = vector.x * (matrix[0][0] + matrix[1][0] + matrix[2][0] + matrix[3][0]); 

...

सही क्रम होगा:: समस्या जम जाता है कि एक्स घटक केवल मैट्रिक्स पंक्तियों के द्वारा ठीक किया एक्स और के रूप में व्यक्त किया जा सकता है

result = vml (matrix[0], vector.xxxx); 
result = vmla(result, matrix[1], vector.yyyy); 

...

नीयन और एसएसई में फ़ील्ड के लिए अंतर्निहित चयन नहीं है (इसके लिए प्रति वेक्टर रजिस्टर में निर्देश इंकोडिंग में 8 बिट्स की आवश्यकता होगी)। उदाहरण के लिए जीएलएसएल/एचएलएसएल में इस प्रकार की सुविधाएं हैं, इसलिए अधिकांश जीपीयू भी हैं। इस लक्ष्य को हासिल करने के लिए

वैकल्पिक तरीका होगा:

result.x = dp4(vector, matrix[0]); 
result.y = dp4(vector, matrix[1]); 

... // और हां, मैट्रिक्स इस एक ही परिणाम

mul उपज के लिए स्थानांतरित किया जाएगा, MADD, MADD, मैड अनुक्रम आमतौर पर पसंद किया जाता है क्योंकि इसे लक्षित रजिस्टर फ़ील्ड के लिए लेखन मास्क की आवश्यकता नहीं होती है।

अन्यथा कोड अच्छा दिखता है। =)

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