क्या बीएलएएस कार्यान्वयन समान परिणाम देने की गारंटी है?


17

दो अलग-अलग बीएलएएस कार्यान्वयनों को देखते हुए, क्या हम यह उम्मीद कर सकते हैं कि वे सटीक एक ही फ्लोटिंग पॉइंट कम्प्यूटेशन करें और एक ही परिणाम लौटाएँ? या ऐसा हो सकता है, उदाहरण के लिए, कि एक अदिश उत्पाद की गणना करता है और एक ( x 1 y 1 + x 2 y) 2 ) + ( x 3 y 3 + x 4)

((एक्स1y1+एक्स2y2)+एक्स3y3)+एक्स4y4
तो संभवतः चल बिन्दु अंकगणितीय आईईईई में अलग परिणाम दे रही है?
(एक्स1y1+एक्स2y2)+(एक्स3y3+एक्स4y4),

1
इस थ्रेड में BLAS गुणवत्ता के बारे में कुछ शिकायतें हैं , पृष्ठ में CBLAS की खोज करें। यह सुझाव देगा कि न केवल वे एक ही परिणाम दें, बल्कि उन सभी को किसी भी कार्य के लिए पर्याप्त सटीक नहीं है ...
Szabolcs

जवाबों:


15

नहीं, यह गारंटी नहीं है। यदि आप बिना किसी अनुकूलन के NETLIB BLAS का उपयोग कर रहे हैं, तो यह ज्यादातर सही है कि परिणाम समान हैं। लेकिन BLAS और LAPACK के किसी भी व्यावहारिक उपयोग के लिए एक उच्च अनुकूलित समानांतर BLAS का उपयोग करता है। समानांतरकरण का कारण बनता है, भले ही यह केवल सीपीयू के वेक्टर रजिस्टरों के अंदर समानांतर में काम करता है, कि एकल शब्दों का मूल्यांकन कैसे किया जाता है और योग का क्रम भी बदलता है। अब यह IEEE मानक में अनुपस्थित साहचर्य गुण का निर्माण करता है, जिसके परिणाम समान नहीं होते हैं। तो वास्तव में आपके द्वारा बताई गई बात हो सकती है।

NETLIB BLAS में स्केलर उत्पाद केवल एक कारक 5 द्वारा अनियंत्रित लूप के लिए है:

DO I = MP1,N,5
          DTEMP = DTEMP + DX(I)*DY(I) + DX(I+1)*DY(I+1) +
     $            DX(I+2)*DY(I+2) + DX(I+3)*DY(I+3) + DX(I+4)*DY(I+4)
END DO

और यह कंपाइलर पर निर्भर करता है यदि प्रत्येक गुणक को तुरंत DTEMP में जोड़ा जाता है या यदि सभी 5 घटकों को पहले जोड़ दिया जाता है और DTEMP में जोड़ दिया जाता है। OpenBLAS में यह आर्किटेक्चर के आधार पर अधिक जटिल कर्नेल है:

 __asm__  __volatile__
    (
    "vxorpd     %%ymm4, %%ymm4, %%ymm4               \n\t"
    "vxorpd     %%ymm5, %%ymm5, %%ymm5               \n\t"
    "vxorpd     %%ymm6, %%ymm6, %%ymm6               \n\t"
    "vxorpd     %%ymm7, %%ymm7, %%ymm7               \n\t"

    ".align 16                           \n\t"
    "1:                          \n\t"
        "vmovups                  (%2,%0,8), %%ymm12         \n\t"  // 2 * x
        "vmovups                32(%2,%0,8), %%ymm13         \n\t"  // 2 * x
        "vmovups                64(%2,%0,8), %%ymm14         \n\t"  // 2 * x
        "vmovups                96(%2,%0,8), %%ymm15         \n\t"  // 2 * x

    "vmulpd      (%3,%0,8), %%ymm12, %%ymm12 \n\t"  // 2 * y
    "vmulpd    32(%3,%0,8), %%ymm13, %%ymm13 \n\t"  // 2 * y
    "vmulpd    64(%3,%0,8), %%ymm14, %%ymm14 \n\t"  // 2 * y
    "vmulpd    96(%3,%0,8), %%ymm15, %%ymm15 \n\t"  // 2 * y

    "vaddpd      %%ymm4 , %%ymm12, %%ymm4 \n\t"  // 2 * y
    "vaddpd      %%ymm5 , %%ymm13, %%ymm5 \n\t"  // 2 * y
    "vaddpd      %%ymm6 , %%ymm14, %%ymm6 \n\t"  // 2 * y
    "vaddpd      %%ymm7 , %%ymm15, %%ymm7 \n\t"  // 2 * y

    "addq       $16 , %0	  	     \n\t"
	"subq	        $16 , %1            \n\t"      
    "jnz        1b                   \n\t"
...

जो लंबाई 4 के छोटे स्केलर उत्पादों में स्केलर उत्पाद को विभाजित करता है और उन्हें योग करता है।

ATLAS, MKL, ESSL, जैसे अन्य विशिष्ट BLAS कार्यान्वयन का उपयोग ... यह समस्या समान रहती है क्योंकि प्रत्येक BLAS कार्यान्वयन तेज़ कोड प्राप्त करने के लिए विभिन्न अनुकूलन का उपयोग करता है। लेकिन जहां तक ​​मुझे पता है कि एक व्यक्ति को वास्तव में दोषपूर्ण परिणाम के लिए एक कृत्रिम उदाहरण की आवश्यकता है।

यदि यह आवश्यक है कि बीएलएएस पुस्तकालय उसी परिणाम के लिए वापस आए (बिट-वार वही) तो एक प्रतिलिपि प्रस्तुत करने योग्य बीएलएएस पुस्तकालय का उपयोग करना होगा जैसे:


8

संक्षिप्त उत्तर

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

हालांकि, प्रदर्शन की खातिर इस व्यवहार को तोड़ सकते हैं ...

दीर्घ उत्तर

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

+*सी


3
"फ्लोटिंग पॉइंट अंकगणितीय यादृच्छिक नहीं है" । यह दुखद है कि इसे स्पष्ट रूप से कहा जाना चाहिए, लेकिन ऐसा लगता है कि बहुत से लोग सोचते हैं कि यह है ...
पाइप

ठीक है, अप्रत्याशित और यादृच्छिक बहुत सुंदर दिखते हैं, और बहुत सारे इंट्रो प्रोग्रामिंग क्लासेस कहते हैं "कभी भी समानता के लिए फ़्लोट्स की तुलना नहीं करते हैं," जो यह धारणा देता है कि पूर्णांक को उसी तरह से पूर्ण नहीं किया जा सकता है जैसे कि पूर्णांक।
टायलर ऑलसेन

@TylerOlsen यह सवाल के लिए प्रासंगिक नहीं है, और यही कारण है कि उन वर्गों ने ऐसी बातें नहीं कही हैं, लेकिन IIRC, संकलक कीड़े का एक वर्ग हुआ करता था जहां समानता पर भरोसा नहीं किया जा सकता था। उदाहरण के लिए, कभी-कभी असफल if (x == 0) assert(x == 0) हो सकता है , जो एक निश्चित दृष्टिकोण से यादृच्छिक के रूप में अच्छा है।
किरिल

@Kirill क्षमा करें, मैं बस इस बात को बनाने की कोशिश कर रहा था कि बहुत से लोग कभी नहीं सीखते कि फ्लोटिंग पॉइंट कैसे काम करता है। ऐतिहासिक बिंदु के लिए, यह एक तरह से भयानक है, लेकिन इससे पहले कि मैं खेल में आ गया हूं, इसका समाधान हो गया होगा।
टायलर ऑलसेन

@TylerOlsen ओह, मेरा उदाहरण गलत है। यह होना चाहिए if (x != 0) assert(x != 0), क्योंकि विस्तारित-सटीक अंकगणित।
किरिल

4

सामान्य तौर पर, नहीं। एकरूपता को छोड़कर, संकलक झंडे की पसंद (उदाहरण के लिए, SIMD निर्देश सक्षम किया जा रहा है, जुड़े हुए गुणा का उपयोग , आदि) या हार्डवेयर (जैसे, क्या एक्सटेंडेड एक्सटेंडेड का उपयोग किया जा रहा है) अलग-अलग परिणाम दे सकते हैं।

प्रजनन योग्य बीएलएएस कार्यान्वयन प्राप्त करने के लिए कुछ प्रयास हैं। देखें ReproBLAS और ExBLAS अधिक जानकारी के लिए।


1
इंटेल के MKL BLAS के हाल के संस्करणों में कंडिशनल न्यूमेरिकल रिप्रोड्यूसबिलिटी (CNR) फीचर भी देखें। एहसास करें कि प्रजनन स्तर के इस स्तर को प्राप्त करना आमतौर पर आपकी गणना को धीमा कर देगा और उन्हें बहुत धीमा कर सकता है!
ब्रायन Borchers
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.