आप एक xm रजिस्टर में NaN कैसे डाल सकते हैं?


9

फ़ंक्शन के लिए मैं लिख रहा हूं अगर कोई इनपुट वापस नहीं करता है तो मैं एक एनएएन वापस करना चाहता हूं।

मैं एक एक्सएमएम रजिस्टर करने का सबसे आसान तरीका कैसे एक NaN सम्मिलित कर सकता हूं ?


1
आप यह कैसे निर्धारित करते हैं कि "इनपुट का कोई मतलब नहीं है"? यदि यह एक तुलना का परिणाम है, तो आप तुलना के परिणाम-मुखौटा के साथ बस बिटवाइज़ कर सकते हैं-या आपका "सामान्य" परिणाम।
chtz

जवाबों:


13

ऑल-वे एक शांत (गैर-सिग्नलिंग, उर्फ ​​सामान्य) NaN है, जो आप चाहते हैं। एक उत्पादन करने का सबसे आसान तरीका है SSE2 के साथ pcmpeqd xmm0,xmm0रजिस्टर में हर बिट को सेट करना 1, अर्थात 2 का पूरक पूर्णांक -1। ( सीपीयू में सभी बिट्स को कुशलतापूर्वक 1 पर सेट करें / मक्खी पर वेक्टर स्थिरांक उत्पन्न करने के लिए सबसे अच्छा निर्देश अनुक्रम क्या हैं? )

यह वास्तव में एक है -NaN- साइन बिट सेट है। पूर्णांक सही बदलाव ( psrld xmm0,1) पर विचार करें या यदि यह अवांछनीय है तो शून्य / शून्य ( xorps xmm0,xmm0/ divpd xmm0,xmm0) से विभाजित करें ।


मैथ फ़ंक्शंस जो NaN को वापस करना चाहते हैं, अक्सर यह भी सुनिश्चित करना चाहते हैं कि एमएक्ससीएसआर में एफपी-अवैध चिपचिपा अपवाद बिट सेट हो जाता है (या वास्तव में एक अपवाद बढ़ाएं यदि आपका कॉलर उस अपवाद को अनमास्क करता है)। ऐसा करने के लिए कि , आप गुणा या खुद के साथ NaN जोड़ सकते हैं। जैसे

    ...
.error_return_path:
    pcmpeqd   xmm0, xmm0
    mulsd     xmm0, xmm0       ; Cause an FP-invalid operation.
    ret

या mulssएकल-परिशुद्धता के लिए floatmulpd/ mulpsभी उचित होगा।

NaN के साथ NaN के गुणा या जोड़ने के लिए बिट-पैटर्न निश्चित रूप से अभी भी एक NaN है, और अभी भी समान पेलोड होना चाहिए, इसलिए अभी भी सभी।

रिटर्न वैल्यू होने से mulsdया addsd(या divsd) का एक फायदा यह भी होता है कि अगर कॉलर लूप में बार-बार रजिस्टर करता है, तो इसमें डोमेन-क्रॉसिंग बाईपास लेटेंसी नहीं होगी। (सैंडीब्रिज-परिवार पर, यह हमेशा के लिए रहता है। जैसे addsd xmm1, xmm0xmm1 इनपुट से xmm1 आउटपुट में प्रत्येक के पास विलंब का एक अतिरिक्त चक्र होगा यदि xmm0 से आया था pcmpeqd, भले ही वह बहुत पहले से था और पूर्णांक- SIMD यूओपी पहले ही सेवानिवृत्त हो चुका है।)


यदि आप उपयोग करते हैं cmpsdया cmppdआप कर सकते हैं, तो आप इसे शाखा-विहीन भी कर सकते हैंorps इसे NaN या अपरिवर्तित करने के परिणामस्वरूप 0 / -1 मास्क हैं। यदि कुछ अन्य गणनाएँ (या पहले से ही होंगी) एफपी-अवैध झंडे को सेट करती हैं, या यदि आप इस बारे में परवाह नहीं करते हैं, तो आप सभी सेट हैं।

अतिरिक्त सीएमपी के साथ महत्वपूर्ण पथ को लंबा करने से सावधान रहें / या; यदि आप उम्मीद करते हैं कि यह सुपर दुर्लभ है, तो आप अभी भी तुलना और शाखा कर सकते हैं, जैसे movmskpd/ test eax,eax/ jnzएक cmppd परिणाम पर यह देखने के लिए कि या तो बिट सेट किया गया था => SIMD तत्वों में से एक कुछ जांच में विफल रहा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.