SSE स्केलर sqrt (x) rsqrt (x) * x की तुलना में धीमा क्यों है?


106

मैं एक इंटेल कोर डुओ पर हमारे कुछ कोर गणित की रूपरेखा तैयार कर रहा हूं, और वर्गमूल के विभिन्न दृष्टिकोणों को देखते हुए मैंने कुछ अजीब देखा है: SSE स्केलर ऑपरेशन का उपयोग करते हुए, पारस्परिक वर्गमूल लेना और इसे गुणा करना अधिक तेज़ है sqrt पाने के लिए, देशी sqrt opcode का उपयोग करना है!

मैं इसे एक लूप के साथ परीक्षण कर रहा हूँ जैसे:

inline float TestSqrtFunction( float in );

void TestFunc()
{
  #define ARRAYSIZE 4096
  #define NUMITERS 16386
  float flIn[ ARRAYSIZE ]; // filled with random numbers ( 0 .. 2^22 )
  float flOut [ ARRAYSIZE ]; // filled with 0 to force fetch into L1 cache

  cyclecounter.Start();
  for ( int i = 0 ; i < NUMITERS ; ++i )
    for ( int j = 0 ; j < ARRAYSIZE ; ++j )
    {
       flOut[j] = TestSqrtFunction( flIn[j] );
       // unrolling this loop makes no difference -- I tested it.
    }
  cyclecounter.Stop();
  printf( "%d loops over %d floats took %.3f milliseconds",
          NUMITERS, ARRAYSIZE, cyclecounter.Milliseconds() );
}

मैंने TestSqrtFunction के लिए कुछ अलग निकायों के साथ यह कोशिश की है, और मुझे कुछ समय मिल गया है जो वास्तव में मेरे सिर को खरोंच कर रहे हैं। अब तक का सबसे खराब देशी sqrt () फ़ंक्शन का उपयोग कर रहा था और "स्मार्ट" कंपाइलर "ऑप्टिमाइज़" कर रहा था। 24ns / फ्लोट पर, x87 FPU का उपयोग करके यह pathetically खराब था:

inline float TestSqrtFunction( float in )
{  return sqrt(in); }

अगली चीज़ जो मैंने कोशिश की, वह एक आंतरिक का उपयोग करके एसएसई के स्केलर स्कार्ट ओपोड का उपयोग करने के लिए मजबूर करने के लिए किया गया था:

inline void SSESqrt( float * restrict pOut, float * restrict pIn )
{
   _mm_store_ss( pOut, _mm_sqrt_ss( _mm_load_ss( pIn ) ) );
   // compiles to movss, sqrtss, movss
}

यह बेहतर था, 11.9ns / फ्लोट पर। मैंने कार्मैक की निराला न्यूटन-राफसन सन्निकटन तकनीक की भी कोशिश की , जो कि हार्डवेयर से भी बेहतर, 4.3ns / फ्लोट पर चलती थी, हालाँकि 1 से 2 10 की त्रुटि के साथ (जो कि मेरे उद्देश्यों के लिए बहुत अधिक है)।

जब मैं पारस्परिक वर्गमूल के लिए SSE सेशन करने की कोशिश करता था, तब डोज़ी होता था , और तब वर्गमूल (x * 1 / √x = )x) प्राप्त करने के लिए एक बहुतायत से उपयोग किया जाता था। भले ही यह दो आश्रित परिचालनों में लेता हो, लेकिन यह 1.24ns / फ्लोट पर और 2 -14 तक सबसे तेज़ समाधान था :

inline void SSESqrt_Recip_Times_X( float * restrict pOut, float * restrict pIn )
{
   __m128 in = _mm_load_ss( pIn );
   _mm_store_ss( pOut, _mm_mul_ss( in, _mm_rsqrt_ss( in ) ) );
   // compiles to movss, movaps, rsqrtss, mulss, movss
}

मेरा प्रश्न मूल रूप से क्या है ? SSE का अंतर्निहित हार्डवेयर वर्ग रूट opcode दो अन्य गणित कार्यों से बाहर निकलने की तुलना में धीमा क्यों है ?

मुझे यकीन है कि यह वास्तव में स्वयं की लागत है, क्योंकि मैंने सत्यापित किया है:

  • सभी डेटा कैश में फिट होते हैं, और एक्सेस अनुक्रमिक होते हैं
  • कार्य इनबिल्ट हैं
  • पाश को नियंत्रित करने से कोई फर्क नहीं पड़ता
  • कंपाइलर झंडे पूर्ण अनुकूलन के लिए सेट किए गए हैं (और विधानसभा अच्छी है, मैंने जाँच की)

( संपादित करें : स्टेफेंटायरोन सही ढंग से बताता है कि संख्याओं के लंबे तारों पर संचालन को वेक्टरिंग सिमडी पैक ऑप्स का उपयोग करना चाहिए, जैसे rsqrtps- लेकिन यहां सरणी डेटा संरचना केवल परीक्षण के उद्देश्य के लिए है: जो मैं वास्तव में मापने की कोशिश कर रहा हूं वह कोड में उपयोग करने के लिए स्केलर प्रदर्शन है। इसे वेक्टर नहीं किया जा सकता है।)


13
x / sqrt (x) = sqrt (x)। या, दूसरा तरीका: x ^ 1 * x ^ (- 1/2) = x ^ (1 - 1/2) = x ^ (1/2) = sqrt (x)
क्रैश ऑक्ट

6
बेशक inline float SSESqrt( float restrict fIn ) { float fOut; _mm_store_ss( &fOut, _mm_sqrt_ss( _mm_load_ss( &fIn ) ) ); return fOut; }। लेकिन यह एक बुरा विचार है क्योंकि यह एक लोड-हिट-स्टोर स्टाल को आसानी से प्रेरित कर सकता है यदि सीपीयू फ़्लोट्स को स्टैक पर लिखता है और फिर उन्हें तुरंत वापस पढ़ता है - विशेष रूप से रिटर्न वैल्यू के लिए वेक्टर रजिस्टर से फ्लोट रजिस्टर में जुगाड़ करना। बुरी खबर है। इसके अलावा, अंतर्निहित मशीन से पता चलता है कि एसएसई इंट्रिनिक्स वैसे भी एड्रेस ऑपरेंड का प्रतिनिधित्व करता है।
क्रैशर

4
एलएचएस के मामले किसी दिए गए x86 के विशेष जीन और स्टेपिंग पर निर्भर करते हैं: मेरा अनुभव यह है कि i7 तक कुछ भी, रजिस्टर सेट (जैसे FPU से SSE eax) के बीच चल रहा डेटा बहुत खराब है, जबकि xmm0 और स्टैक के बीच एक गोल यात्रा और इंटेल के स्टोर-फ़ॉरवर्डिंग के कारण वापस नहीं आया है। आप यह सुनिश्चित करने के लिए खुद देख सकते हैं। आमतौर पर संभावित एलएचएस को देखने का सबसे आसान तरीका उत्सर्जित विधानसभा को देखना है और यह देखना है कि डेटा रजिस्टर रजिस्टर के बीच कहां तक ​​घूमा है; आपका कंपाइलर स्मार्ट काम कर सकता है, या यह नहीं हो सकता है। वैक्टर को सामान्य करने के लिए, मैंने अपने परिणाम यहाँ लिखे: bit.ly/9W5zoU
Crashworks

2
PowerPC के लिए, हाँ: IBM के पास एक CPU सिम्युलेटर है जो LHS और कई अन्य पाइपलाइन बुलबुले का स्थैतिक विश्लेषण के माध्यम से भविष्यवाणी कर सकता है। कुछ PPCs के पास LHS के लिए एक हार्डवेयर काउंटर होता है जिसे आप पोल कर सकते हैं। यह x86 के लिए कठिन है; अच्छे प्रोफाइलिंग उपकरण स्कारर हैं (वीटीएन इन दिनों कुछ हद तक टूट गया है) और फिर से व्यवस्थित पाइपलाइन कम निर्धारक हैं। आप इसे प्रति चक्र निर्देशों को मापकर अनुभवजन्य रूप से मापने की कोशिश कर सकते हैं, जो हार्डवेयर प्रदर्शन काउंटरों के साथ सटीक रूप से किया जा सकता है। "निर्देश सेवानिवृत्त" और "कुल चक्र" रजिस्टरों जैसे PAPI या PerfSuite (साथ पढ़ा जा सकता है bit.ly/an6cMt )।
19

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

जवाबों:


216

sqrtssएक सही ढंग से गोल परिणाम देता है। लगभग 11 बिट्स के लिए, पारस्परिक को rsqrtssएक अनुमान देता है ।

sqrtssसटीकता की आवश्यकता होने पर अधिक सटीक परिणाम उत्पन्न कर रहा है। rsqrtssउन मामलों के लिए मौजूद है जब एक सन्निकटन पर्याप्त होता है, लेकिन गति की आवश्यकता होती है। यदि आप इंटेल के प्रलेखन को पढ़ते हैं, तो आपको एक निर्देश अनुक्रम (पारस्परिक न्यूक्लियर-राफ्सन कदम के बाद पारस्परिक वर्ग-रूट सन्निकटन) मिलेगा, जो लगभग पूर्ण सटीकता देता है (~ 23 बिट्स सटीकता, अगर मुझे ठीक से याद है), और अभी भी कुछ हद तक है से तेज है sqrtss

संपादित करें: यदि गति महत्वपूर्ण है, और आप वास्तव में इसे कई मानों के लिए लूप में बुला रहे हैं, तो आपको इन निर्देशों के सदिश संस्करणों का उपयोग करना चाहिए, rsqrtpsया sqrtps, जिनमें से प्रत्येक निर्देश में चार फ़्लोट्स की प्रक्रिया होती है।


3
N / r चरण आपको सटीकता के 22-बिट देता है (यह इसे दोगुना करता है); 23-बिट्स पूर्ण सटीकता होगी।
जैस्पर बेकर्स

7
@ जैस्पर बेकर्स: नहीं, यह नहीं होगा। सबसे पहले, फ्लोट में परिशुद्धता के 24 बिट्स होते हैं। दूसरा, sqrtssहै सही ढंग से गोल है, जो की आवश्यकता है ~ 50 बिट्स गोलाई से पहले, और एकल परिशुद्धता में एक साधारण एन / आर यात्रा का प्रयोग कर प्राप्त नहीं किया जा सकता।
स्टीफन कैनन

1
यह निश्चित रूप से कारण है। इस परिणाम का विस्तार करने के लिए: इंटेल का एम्ब्री प्रोजेक्ट ( software.intel.com/en-us/articles/… ), इसके गणित के लिए वेक्टरकरण का उपयोग करता है। आप उस लिंक पर स्रोत को डाउनलोड कर सकते हैं और देख सकते हैं कि वे अपने 3/4 डी वेक्टर्स को कैसे करते हैं। उनके वेक्टर सामान्यीकरण में rsqrt का उपयोग किया जाता है, जिसके बाद न्यूटन-रफसन का एक पुनरावृत्ति होता है, जो तब बहुत सटीक होता है और 1 / ssqrt से भी तेज होता है!
ब्रैंडन पेल्रे

7
एक छोटा चेतावनी: x rsqrt (x) का परिणाम NaN में होता है यदि x या तो शून्य या अनंत है। 0 * rsqrt (0) = 0 * INF = NaN। INF rsqrt (INF) = INF * 0 = NaN। इस कारण से, NVIDIA GPU पर CUDA प्राप्तकर्ता (rsqrt (x)) के रूप में लगभग एकल-सटीक वर्ग जड़ों की गणना करता है, जिसमें हार्डवेयर पारस्परिक और पारस्परिक वर्गमूल दोनों को एक त्वरित सन्निकटन प्रदान करता है। स्पष्ट रूप से, दो विशेष मामलों को संभालने वाले स्पष्ट चेक भी संभव हैं (लेकिन GPU पर धीमा होगा)।
njuffa

@BrandonPelfrey किस फाइल में आपको न्यूटन रैप्सन कदम मिला?
fredoverflow

7

विभाजन के लिए भी यह सच है। MULSS (a, RCPSS (b) DIVSS (a, b) की तुलना में तेज़ है। वास्तव में यह तब भी तेज है जब आप न्यूटन-राफसन पुनरावृत्ति के साथ इसकी सटीकता बढ़ाते हैं।

इंटेल और एएमडी दोनों अपने अनुकूलन मैनुअल में इस तकनीक की सलाह देते हैं। जिन अनुप्रयोगों में IEEE-754 अनुपालन की आवश्यकता नहीं होती है, केवल div / sqrt का उपयोग करने का एकमात्र कारण कोड पठनीयता है।


1
ब्रॉडवेल और बाद में बेहतर एफपी डिवाइड प्रदर्शन होता है, इसलिए क्लैंग जैसे कंपाइलर हाल के सीपीयू पर स्केलर के लिए पारस्परिक + न्यूटन का उपयोग नहीं करते हैं, क्योंकि यह आमतौर पर तेज नहीं होता है। सबसे छोरों में, divकेवल आपरेशन, इसलिए कुल UOP अक्सर अड़चन है throughput यहाँ तक कि जब वहाँ एक नहीं है divpsया divss। देखें बिंदु विभाजन फ्लोटिंग बनाम चल बिन्दु गुणन , जहां मेरा उत्तर क्यों पर एक अनुभाग है rcppsthroughput अब और जीतने के लिए एक नहीं है। (या एक विलंबता जीत), और संख्या को विभाजन / विलंबता से विभाजित करते हैं।
पीटर कॉर्डेस

यदि आपकी सटीकता की आवश्यकता इतनी कम है कि आप न्यूटन पुनरावृत्ति को छोड़ सकते हैं, तो हाँ a * rcpss(b)तेज़ हो सकता है, लेकिन यह अभी भी अधिक से अधिक है a/b!
पीटर कॉर्ड्स

5

उत्तर की आपूर्ति करने के बजाय, यह वास्तव में गलत हो सकता है (मैं कैश और अन्य सामान के बारे में जांच या तर्क नहीं करने जा रहा हूं, मान लें कि वे समान हैं) मैं आपको उस स्रोत की ओर इशारा करने की कोशिश करूंगा जो आपके प्रश्न का उत्तर दे सकता है।
अंतर यह हो सकता है कि sqrt और rsqrt की गणना कैसे की जाती है। आप यहाँ और अधिक पढ़ सकते हैं http://www.intel.com/products/processor/manuals/ । मैं आपके द्वारा उपयोग किए जा रहे प्रोसेसर फ़ंक्शंस के बारे में पढ़ना शुरू करने का सुझाव दूंगा, कुछ जानकारी हैं, विशेष रूप से rsqrt के बारे में (cpu विशाल लुकअप के साथ आंतरिक लुकअप तालिका का उपयोग कर रहा है, जो परिणाम प्राप्त करने के लिए बहुत सरल बनाता है)। ऐसा लगता है, कि rsqrt sqrt की तुलना में बहुत तेज़ है, कि 1 अतिरिक्त mul ऑपरेशन (जो महंगा नहीं है) यहाँ स्थिति को नहीं बदल सकता है।

संपादित करें: कुछ ऐसे तथ्य जो उल्लेख के लायक हो सकते हैं:
1. एक बार जब मैं अपने ग्राफिक्स लाइब्रेरी के लिए कुछ माइक्रो ऑप्टिमाइज़ेशन कर रहा था और मैंने वैक्टर की लंबाई की गणना के लिए rsqrt का उपयोग किया है। (sqrt के बजाय, मैंने इसे rsqrt द्वारा चुकता करने के अपने योग को गुणा किया है, जो कि आपने अपने परीक्षणों में ठीक किया है), और इसने बेहतर प्रदर्शन किया।
2. सरल लुकअप टेबल का उपयोग करके rsqrt को कम करना आसान हो सकता है, जैसा कि rsqrt के लिए है, जब x अनंत तक जाता है, तो 1 / sqrt (x) 0 पर जाता है, इसलिए छोटे x के लिए फ़ंक्शन मान नहीं बदलते हैं (बहुत), जबकि के लिए sqrt - यह अनंत तक जाता है, इसलिए यह इतना आसान मामला है;)।

इसके अलावा, स्पष्टीकरण: मुझे यकीन नहीं है कि मैंने इसे उन पुस्तकों में पाया है जहां मैंने लिंक किया है, लेकिन मुझे पूरा यकीन है कि मैंने पढ़ा है कि rsqrt कुछ लुकअप तालिका का उपयोग कर रहा है, और इसका उपयोग केवल तभी किया जाना चाहिए, जब परिणाम सटीक होने की आवश्यकता नहीं है, हालांकि - मैं गलत भी हो सकता हूं, क्योंकि यह कुछ समय पहले था :)।


4

न्यूटन-रफसन f(x)वेतन वृद्धि का उपयोग करने के शून्य में कनवर्ट करता है -f/f' जहां f'व्युत्पन्न है।

के लिए x=sqrt(y), आप को हल करने की कोशिश कर सकते f(x) = 0के लिए xउपयोग करते हुए f(x) = x^2 - y;

फिर वेतन वृद्धि है: dx = -f/f' = 1/2 (x - y/x) = 1/2 (x^2 - y) / x इसमें एक धीमी गति से विभाजन है।

आप अन्य कार्यों (जैसे f(x) = 1/y - 1/x^2) की कोशिश कर सकते हैं लेकिन वे समान रूप से जटिल होंगे।

आइए 1/sqrt(y)अब देखें। आप कोशिश कर सकते हैं f(x) = x^2 - 1/y, लेकिन यह समान रूप से जटिल होगा: dx = 2xy / (y*x^2 - 1)उदाहरण के लिए। एक गैर-स्पष्ट वैकल्पिक विकल्प f(x)है:f(x) = y - 1/x^2

फिर: dx = -f/f' = (y - 1/x^2) / (2/x^3) = 1/2 * x * (1 - y * x^2)

आह! यह एक तुच्छ अभिव्यक्ति नहीं है, लेकिन आपके पास केवल इसमें कई गुना है, कोई विभाजन नहीं। => तेज़!

और: पूर्ण अद्यतन चरण new_x = x + dxतब पढ़ता है:

x *= 3/2 - y/2 * x * x जो आसान भी है।


2

कुछ वर्षों पहले से ही इसके कई अन्य उत्तर हैं। यहां सर्वसम्मति सही है:

  • Rsqrt * निर्देश पारस्परिक वर्गमूल के एक सन्निकटन की गणना करते हैं, जो लगभग 11-12 बिट्स तक अच्छा होता है।
  • यह एक लुकअप टेबल (यानी एक ROM) के साथ मंटिसा द्वारा अनुक्रमित किया गया है। (वास्तव में, यह एक संकुचित लुकअप तालिका है, पुराने के गणितीय तालिकाओं के समान, ट्रांजिस्टर को बचाने के लिए कम-ऑर्डर बिट्स के समायोजन का उपयोग करते हुए।)
  • यह क्यों उपलब्ध है इसका कारण यह है कि यह "वास्तविक" स्क्वायर रूट एल्गोरिथ्म के लिए FPU द्वारा उपयोग किया जाने वाला प्रारंभिक अनुमान है।
  • एक अनुमानित पारस्परिक निर्देश, आरसीपी भी है। ये दोनों निर्देश एक संकेत है कि एफपीयू वर्गमूल और विभाजन को कैसे लागू करता है।

यहाँ क्या सहमति गलत है:

  • SSE- युग FPUs वर्गमूल की गणना करने के लिए न्यूटन-रफसन का उपयोग नहीं करते हैं। यह सॉफ्टवेयर में एक शानदार तरीका है, लेकिन इसे हार्डवेयर में इस तरह से लागू करना एक गलती होगी।

पारस्परिक वर्गमूल की गणना करने के लिए NR एल्गोरिदम में यह अद्यतन कदम है, जैसा कि अन्य ने नोट किया है:

x' = 0.5 * x * (3 - n*x*x);

यह बहुत अधिक डेटा-निर्भर गुणन और एक घटाव है।

निम्नानुसार एल्गोरिथ्म है कि आधुनिक FPUs वास्तव में उपयोग करते हैं।

देखते हैं b[0] = n, मान लें कि हम संख्याओं की एक श्रृंखला पा सकते हैं, Y[i]जो b[n] = b[0] * Y[0]^2 * Y[1]^2 * ... * Y[n]^2दृष्टिकोण 1 है। फिर विचार करें:

x[n] = b[0] * Y[0] * Y[1] * ... * Y[n]
y[n] = Y[0] * Y[1] * ... * Y[n]

स्पष्ट रूप x[n]से sqrt(n)और y[n]दृष्टिकोण 1/sqrt(n)

हम एक अच्छा पाने के लिए पारस्परिक वर्गमूल के लिए न्यूटन-रफसन अपडेट स्टेप का उपयोग कर सकते हैं Y[i]:

b[i] = b[i-1] * Y[i-1]^2
Y[i] = 0.5 * (3 - b[i])

फिर:

x[0] = n Y[0]
x[i] = x[i-1] * Y[i]

तथा:

y[0] = Y[0]
y[i] = y[i-1] * Y[i]

अगली कुंजी अवलोकन है b[i] = x[i-1] * y[i-1]। इसलिए:

Y[i] = 0.5 * (3 - x[i-1] * y[i-1])
     = 1 + 0.5 * (1 - x[i-1] * y[i-1])

फिर:

x[i] = x[i-1] * (1 + 0.5 * (1 - x[i-1] * y[i-1]))
     = x[i-1] + x[i-1] * 0.5 * (1 - x[i-1] * y[i-1]))
y[i] = y[i-1] * (1 + 0.5 * (1 - x[i-1] * y[i-1]))
     = y[i-1] + y[i-1] * 0.5 * (1 - x[i-1] * y[i-1]))

प्रारंभिक एक्स और वाई को देखते हुए, हम निम्नलिखित अद्यतन चरण का उपयोग कर सकते हैं:

r = 0.5 * (1 - x * y)
x' = x + x * r
y' = y + y * r

या, कट्टर भी, हम सेट कर सकते हैं h = 0.5 * y। यह प्रारंभिक है:

Y = approx_rsqrt(n)
x = Y * n
h = Y * 0.5

और यह अद्यतन चरण है:

r = 0.5 - x * h
x' = x + x * r
h' = h + h * r

यह गोल्डस्मिडेट का एल्गोरिथ्म है, और इसका एक बड़ा फायदा है अगर आप इसे हार्डवेयर में लागू कर रहे हैं: "इनर लूप" तीन गुणा है-और कुछ नहीं है, और उनमें से दो स्वतंत्र हैं और पाइपलाइन किए जा सकते हैं।

1999 में, एफपीयू को पहले से ही एक पाइपलाइंड ऐड / सब्स्ट्रेक्ट सर्किट और एक पाइपलाइज्ड मल्टीली सर्किट की आवश्यकता थी, अन्यथा SSE बहुत "स्ट्रीमिंग" नहीं होता। 1999 में केवल एक सर्किट की जरूरत थी, इस आंतरिक लूप को पूरी तरह से पाइपलाइज्ड तरीके से लागू करने के लिए, केवल स्क्वायर रूट पर बहुत सारे हार्डवेयर को बर्बाद किए बिना।

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


1
संबंधित: संकलित होने के बाद GCC का sqrt () कैसे काम करता है? जड़ की किस विधि का उपयोग किया जाता है? न्यूटन- Raphson? हार्डवेयर div / sqrt निष्पादन इकाई डिजाइन के कुछ लिंक हैं। SSE / AVX के साथ तेज सदिश rsqrt और पारस्परिक सटीकता - एक सॉफ्टवेयर के न्यूटन पुनरावृत्ति पर निर्भर करता है , FMA के साथ या बिना उपयोग के साथ _mm256_rsqrt_ps, हैसवेल पूर्ण विश्लेषण के साथ। आमतौर पर केवल एक अच्छा विचार है यदि आपके पास लूप में अन्य काम नहीं है और विभक्त थ्रूपुट पर कठिन अड़चन होगी। HW sqrt एकल यूओपी है इसलिए अन्य काम के साथ ठीक है।
पीटर कॉर्ड्स

-2

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


जाहिर है गलत है। एफएमए वर्तमान गोलाई मोड पर निर्भर करता है, लेकिन हसवेल और बाद में दो प्रति घड़ी का एक थ्रूपुट है। दो पूरी तरह से पाइपलाइन वाली एफएमए इकाइयों के साथ, हैसवेल में एक बार में 10 एफएमए तक की उड़ान हो सकती है। सही जवाब है rsqrtकी बहुत कम सटीक है, जो एक शुरू करने अनुमान पाने के लिए एक टेबल देखने के बाद बहुत कम काम करने के लिए (या सब पर कोई भी?) का मतलब है।
पीटर कॉर्डेस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.