आपको ऐसे कार्य के लिए वीएफपी इकाई का उपयोग करने में सक्षम होना चाहिए। नीयन और वीएफपी एक ही रजिस्टर बैंक को साझा करते हैं, जिसका अर्थ है कि आपको एक इकाई का लाभ उठाने के लिए रजिस्टरों के चारों ओर घूमने की जरूरत नहीं है और उनके पास एक ही रजिस्टर बिट्स के अलग-अलग विचार भी हो सकते हैं।

आपका float32x4_t
इसलिए यह एक क्वाड (क्यू) पर बैठना चाहिए रजिस्टर 128 बिट है। यदि आप पूरी तरह से हाथ आंतरिक का उपयोग कर रहे हैं तो आप नहीं जान पाएंगे कि आप किसका उपयोग कर रहे हैं। समस्या यह है कि अगर यह 4 से ऊपर बैठा है, तो वीएफपी इसे उत्सुक पाठक के लिए एक सटीक () के रूप में नहीं देख सकता है: मैंने यह आसान रखा क्योंकि वीएफपी संस्करणों के बीच मतभेद हैं और यह न्यूनतम न्यूनतम आवश्यकता है।)। तो यह सबसे अच्छा होगा अपने float32x4_t
Q0
की तरह एक निश्चित रजिस्टर करने के लिए स्थानांतरित करने के लिए होगा। इसके बाद आप केवल vadd.f32
के साथ एस 0, एस 1, एस 2 जैसे रजिस्टरों को जोड़ सकते हैं और परिणाम को एआरएम रजिस्टर में ले जा सकते हैं।
कुछ चेतावनी ... VFP और नियोन एक ही रजिस्टर बैंक और पाइप लाइन को साझा करने के सैद्धांतिक रूप से अलग निष्पादन इकाइयां हैं। मुझे यकीन नहीं है कि यह दृष्टिकोण दूसरों की तुलना में बेहतर है, मुझे फिर से कहना जरूरी नहीं है, आपको बेंचमार्क करना चाहिए। इसके अलावा यह दृष्टिकोण नियॉन आंतरिक के साथ सुव्यवस्थित नहीं है, इसलिए आपको शायद इनलाइन असेंबली के साथ अपना कोड तैयार करना होगा।
मैं इस तरह देख सकते हैं कि कैसे को देखने के लिए एक सरल टुकड़ा था और मैं इस के साथ आ गया है:
#include "arm_neon.h"
float32_t sum3() {
register float32x4_t v asm ("q0");
float32_t ret;
asm volatile(
"vadd.f32 s0, s1\n"
"vadd.f32 s0, s2\n"
"vmov %[ret], s0\n"
: [ret] "=r" (ret)
:
:);
return ret;
}
इसके बारे में objdump
लगता है कि (जीसीसी के साथ संकलित -O3 -mfpu = नीयन -mfloat- abi = softfp)
00000000 <sum3>:
0: ee30 0a20 vadd.f32 s0, s0, s1
4: ee30 0a01 vadd.f32 s0, s0, s2
8: ee10 3a10 vmov r0, s0
c: 4770 bx lr
e: bf00 nop
यदि आप इसे जाने देते हैं तो मैं वास्तव में आपके इंप्रेशन सुनना चाहूंगा!