c - Is naive ladder logic better than factored logic? -


एसएसबी newb यहाँ ...

मैं एक नियमानुसार दो कार्यान्वयन का परीक्षण कर रहा हूं जो नेस्टेड लॉजिक : एक सरल कार्यान्वयन और एक जहां मैं चालाक रहा हूँ, कुछ शाखाओं को हटाने का प्रयास करने के लिए। मैं जीसीसी विकल्पों के साथ 'जीसीसी (उबंटू / लिंडारो 4.6.3-1 बुन्तुउ 5) 4.6.3' एक्स 86 मेरॉम का उपयोग कर रहा हूं '-फ़ीटक-गणित-फोमेट-फ़्रेम-पॉइंटर -मिसेफ़ेम्प- mfpmath = sse -msse2' कोड निम्नानुसार है:

  #define math_sign (a) ((a) & lt; .0f? -1.f: + 1.f) इनलाइन फ़्लैट math_interp_clamp (फ्लोट ए, फ़्लोट ढलान, फ्लोट लक्ष्य ) {#if 0 // 5 instr, 1 शाखा फ्लोट बी = ए + ढलान; वापसी ढलान & gt; 0. एफ? (बी & gt; लक्ष्य? लक्ष्य: बी): (बी एंड एलटी; लक्ष्य? लक्ष्य: बी); # एल्स // 1 9 इंस्टा फ्लोट बी = ए + ढलान; वापसी (बी - लक्ष्य) * math_sign (ढलान) & gt; 0. एफ? लक्ष्य: बी; # एडीआईफ़}   

मेरे ifdef सक्षम के साथ मुझे मिल रहा है:

  math_interp_clamp: .lfb505: .cfi_startproc comiss .LC7,% xmm1 एडीएसएस% xmm1,% xmm0 jbe .L44 minss% xmm0,% xmm2 movaps% xmm2,% xmm0 ret .L44: maxss% xmm0,% xmm2 movaps% xmm2,% xmm0 रिट। cfi_endproc   

मेरे ifdef अक्षम के साथ I प्राप्त करें:

  math_interp_clamp: .lfb505: .cfi_startproc xorps% xmm5,% xmm5 addss% xmm1,% xmm0 movss। एलसी 3,% xmm4 सेमीप्लट्स% xmm5,% xmm1 movss। Lc2,% xmm6 movaps % Xmm0,% xmm3 औरप्स% xmm1,% xmm4 और एनएनपीएस% xmm6,% xmm1 सबस्क्राइम% xmm2,% xmm3 orps% xmm4,% xmm1 mulss% xmm1,% xmm3 movaps% xmm5,% xmm1 सेमीप्लसस% xmm3,% xmm1 movaps% xmm2 ,% Xmm3 movaps% xmm1,% xmm2 andps% xmm1,% xmm3 और एनएनपीएस% xmm0,% xmm2 orps% xmm3,% xmm2 movaps% xmm2,% xmm0 ret। Cfi_endproc   

मेरे पास नहीं है वास्तव में उत्पन्न कोड का समय समाप्त हो गया है, लेकिन चक्र-गिनती के आधार पर मैं उन 19 निर्देशों को केवल शाखा से ज्यादा तेज नहीं समझ सकता हूं ... मैं शाखाओं से बचने में कितना क्रूर होना चाहिए, या मैं जीसीसी गलत इस्तेमाल कर रहा हूं? < पी> एक अच्छा समय-कतार या क्यूई-ट्यूटोरियल को अनुग्रहपूर्वक स्वीकार किया गया लिंक।

जीसीसी 4.9.2 संकलन 16 निर्देशों के लिए शाखाहीन संस्करण या 19 जैसे तुम्हारा -m32 -msse लेकिन नहीं -m32 -msse2 के साथ। उन निर्देशों में समानता की एक सभ्य मात्रा है, लेकिन दुर्भाग्य से एफपी लॉजिकल (जैसे orps ) केवल मौजूदा इंटेल डिज़ाइन में एक ही बंदरगाह पर चला सकते हैं। (सभी 3 वेक्टर एएलयू पोर्ट्स के मुकाबले por यूप्स को स्वीकार करने में सक्षम हैं।)

जीसीसी आपके "अनुभवहीन" संस्करण को बिना किसी आधारहीन रूप से संकलित करता है, -O3 -fast-math < / code>। (बिना -फास्ट-गणित , यह अभी भी एक शाखा का उपयोग करता है। मैंने यह देखने के लिए बिट ऑप्स की जांच नहीं की है कि परिणाम NaNs के साथ समान हैं या नहीं)। आपके भोले संस्करण को लिखने का एक तरीका हो सकता है ताकि यह बिना -पूर्ण-गणित एक शाखाहीन संस्करण बना सके। शायद ! (B & lt; लक्ष्य) के बजाय b & gt; लक्ष्य , तो क्या एनएएन हैंडलिंग समान है? आईडीके।

  math_interp_clamp: # जीसीसी 4.9.2-ओ 3 -स्टेस्ट-गणित .LFB0: एडीएसएस% xmm1,% xmm0 movaps% xmm0,% xmm3 maxss% xmm2,% xmm3 minss% xmm0, % xmm2 pxor% xmm0,% xmm0 cmpltss% xmm1,% xmm0 andps% xmm0,% xmm2 और एनएनपीएस% xmm3,% xmm0 orps% xmm2,% xmm0 ret   

यह संभवतः एक जीत है, जब तक कि शाखा बहुत उम्मीदवार नहीं है (यानी मूल्य लगभग कभी clamping की जरूरत नहीं है) आपका सबसे अच्छा सर्वोत्तम -fprofile-generate / -fprofile-use है, और संकलक तय करने दें।

अनियमितता से, मैंने ब्रांडेलेस को देखा संस्करण x87 ( -m32 -O3 ) के साथ। हालांकि x87 में fcmovbe है, यह अभी भी 19 insns के लिए संकलित है क्योंकि x87 को स्टैक पॉप करने के लिए अतिरिक्त निर्देशों की आवश्यकता होती है (और फ़ंक्शन एआरजी रेग में शुरू नहीं होती है)।

xmm रजिस्टरों के लिए झंडे के आधार पर सीएमवी



Comments

Popular posts from this blog

Pass DB Connection parameters to a Kettle a.k.a PDI table Input step dynamically from Excel -

multithreading - PhantomJS-Node in a for Loop -

c++ - MATLAB .m file to .mex file using Matlab Compiler -