ऐसा लगता है कि आप मूल्यांकन करना चाहते हैं कि एफपीयू-बाउंड आपका कोड कैसा है, या आप एफपीयू का उपयोग कितनी प्रभावी ढंग से कर रहे हैं, बजाय इसके कि एक "फ्लॉप" की एनाक्रोनॉस्टिक परिभाषा के अनुसार फ्लॉप की संख्या की गणना करें। दूसरे शब्दों में, आप एक मीट्रिक चाहते हैं जो उसी चरम पर पहुंच जाए यदि हर फ्लोटिंग पॉइंट यूनिट हर चक्र पर पूरी क्षमता से चल रही हो। आइए एक इंटेल सैंडी ब्रिज को देखें कि यह कैसे हिल सकता है।
हार्डवेयर समर्थित फ्लोटिंग पॉइंट ऑपरेशन
यह चिप AVX निर्देशों का समर्थन करती है , इसलिए रजिस्टरों की लंबाई 32 बाइट्स (4 डबल्स को पकड़कर) होती है। सुपरस्केलर आर्किटेक्चर निर्देशों को ओवरलैप करने की अनुमति देता है, अधिकांश अंकगणितीय निर्देशों को पूरा करने के लिए कुछ चक्र लेने के बावजूद, भले ही एक नया निर्देश अगले चक्र पर शुरू करने में सक्षम हो। इन शब्दार्थों को आमतौर पर विलंबता / उलटा थ्रूपुट लिखकर संक्षिप्त किया जाता है, 5/2 के मान का मतलब होगा कि निर्देश को पूरा करने के लिए 5 चक्र लगते हैं, लेकिन आप हर दूसरे चक्र में एक नया निर्देश शुरू कर सकते हैं (यह मानते हुए कि ऑपरेंड उपलब्ध हैं, इसलिए कोई डेटा नहीं निर्भरता और स्मृति की प्रतीक्षा नहीं)।
प्रति कोर में तीन फ़्लोटिंग अंक अंकगणितीय इकाइयां हैं, लेकिन तीसरा हमारी चर्चा के लिए प्रासंगिक नहीं है, हम प्रासंगिक दो ए और एम इकाइयों को बुलाएंगे क्योंकि उनके प्राथमिक कार्य इसके अलावा और गुणन हैं। उदाहरण के निर्देश ( Agner Fog की सारणी देखें )
vaddpd
: 1 जोड़, 1 चक्र, विलंबता / व्युत्क्रम थ्रूपुट के लिए A को कब्जे में लेकर जोड़ा गया पैक 3/1 है
vmulpd
: पैक्ड गुणा, यूनिट एम, 5/1
vmaxpd
: चुनिंदा जोड़ीदार अधिकतम, इकाई ए, 3/1
vdivpd
: पैक्ड डिवाइड, यूनिट एम (और कुछ ए), इनपुट के आधार पर 21/20 से 45/44
vsqrtpd
: वर्गमूल, कुछ ए और एम, 21/21 से 43/43 इनपुट के आधार पर पैक
vrsqrtps
: एकल परिशुद्धता इनपुट के लिए कम सटीकता वाले पारस्परिक वर्गमूल को पैक किया गया (8 floats
)
जो कुछ ओवरलैप हो सकता है vdivpd
और vsqrtpd
जो स्पष्ट रूप से सूक्ष्म और AFAIK है, उसके लिए सटीक शब्दार्थ कहीं भी प्रलेखित नहीं हैं। अधिकांश उपयोगों में, मुझे लगता है कि ओवरलैप के लिए बहुत कम संभावना है, हालांकि मैनुअल में शब्दों से पता चलता है कि कई धागे इस निर्देश में ओवरलैप के लिए अधिक संभावना प्रदान कर सकते हैं। यदि हम प्रत्येक चक्र पर vaddpd
और vmulpd
प्रत्येक चक्र पर कुल 8 फ्लॉप के लिए चोटी फ्लॉप को हिट कर सकते हैं। घने मैट्रिक्स-मैट्रिक्स गुणा ( dgemm
) इस शिखर के करीब यथोचित प्राप्त कर सकते हैं।
विशेष निर्देशों के लिए फ्लॉप की गिनती करते समय, मैं देखूंगा कि एफपीयू का कितना कब्जा है। तर्क के लिए मान लीजिए कि आपके इनपुट की सीमा में, vdivpd
इकाई एम को पूरी तरह से पूरा करने के लिए औसतन 24 चक्र लगे, लेकिन इसके अलावा (यदि यह उपलब्ध था) आधे चक्रों के लिए समवर्ती रूप से निष्पादित किया जा सकता है। FPU उन चक्रों (पूरी तरह से interleaved vaddpd
और vmulpd
) के दौरान 24 पैक किए गए गुणक और 24 पैक किए गए अतिरिक्त प्रदर्शन करने में सक्षम है , लेकिन एक के साथ vdivpd
, सबसे अच्छा हम कर सकते हैं 12 अतिरिक्त पैक जोड़ता है। यदि हम मानते हैं कि विभाजन करने का सबसे अच्छा तरीका हार्डवेयर (उचित) का उपयोग करना है, तो हम vdivpd
36 पैक "फ्लॉप" के रूप में गिन सकते हैं , यह दर्शाता है कि हमें प्रत्येक स्केलर को 36 "फ्लॉप" के रूप में विभाजित करना चाहिए।
पारस्परिक वर्गमूल के साथ, कभी-कभी हार्डवेयर को हरा पाना संभव होता है, खासकर यदि पूर्ण सटीकता की आवश्यकता नहीं है, या यदि इनपुट की सीमा संकीर्ण है। जैसा कि ऊपर उल्लेख किया गया है, vrsqrtps
निर्देश बहुत सस्ती है, इसलिए (यदि एकल परिशुद्धता में) आप vrsqrtps
एक या दो न्यूटन पुनरावृत्तियों के बाद सफाई कर सकते हैं। ये न्यूटन पुनरावृत्तियों बस हैं
y *= (3 - x*y*y)*0.5;
यदि इनमें से कई परिचालनों को निष्पादित करने की आवश्यकता है, तो यह भोले मूल्यांकन के मुकाबले काफी तेज हो सकता है y = 1/sqrt(x)
। हार्डवेयर अनुमानित पारस्परिक वर्गमूल की उपलब्धता से पहले, कुछ प्रदर्शन-संवेदनशील कोड ने न्यूटन पुनरावृत्ति के लिए प्रारंभिक अनुमान लगाने के लिए कुख्यात पूर्णांक संचालन का उपयोग किया ।
पुस्तकालय-प्रदत्त गणित कार्य
हम पुस्तकालय-प्रदान गणित कार्यों के लिए एक समान अनुमान लागू कर सकते हैं। आप SSE निर्देशों की संख्या निर्धारित करने के लिए प्रोफ़ाइल कर सकते हैं, लेकिन जैसा कि हमने चर्चा की है, यह पूरी कहानी और एक कार्यक्रम नहीं है जो अपना सारा समय विशेष कार्यों का मूल्यांकन करने में बिताता है, जो कि चोटी के करीब पहुंचने के लिए प्रकट नहीं हो सकता है, जो सच हो सकता है, लेकिन isn 'आपको यह बताने के लिए उपयोगी है कि एफपीयू पर आपके नियंत्रण से बाहर हर समय खर्च किया जाता है।
मैं आधार रेखा के रूप में एक अच्छी वेक्टर गणित लाइब्रेरी (जैसे इंटेल का वीएमएल, एमकेएल का हिस्सा) का उपयोग करने का सुझाव देता हूं। प्रत्येक कॉल के लिए चक्र की संख्या को मापें और उस चक्र की संख्या से अधिक प्राप्त करने योग्य फ्लॉप से गुणा करें। इसलिए अगर एक पैक एक्सपोनेंशियल का मूल्यांकन करने के लिए 50 चक्र लगते हैं, तो इसे रजिस्टर फ़्लो के 100 गुना गुणा के रूप में गिनें। दुर्भाग्य से, वेक्टर गणित पुस्तकालयों को कभी-कभी कॉल करना मुश्किल होता है और सभी विशेष कार्य नहीं होते हैं, इसलिए आप स्केलर गणित करना समाप्त कर सकते हैं, इस स्थिति में आप हमारे काल्पनिक स्केलर घातीय को 100 फ्लॉप के रूप में गिनेंगे (भले ही यह अभी भी 50 लेता है। चक्र, तो आप केवल "शिखर" का 25% प्राप्त कर रहे होंगे यदि सभी समय इन घातांक का मूल्यांकन करने में खर्च होता है)।
जैसा कि दूसरों ने उल्लेख किया है, आप पीएपीआई या विभिन्न इंटरफेस का उपयोग करके साइकिल और हार्डवेयर इवेंट काउंटर की गिनती कर सकते हैं। सरल चक्र की गिनती के लिए, आप rdtsc
इनलाइन असेंबली के एक स्निपेट के साथ निर्देश का उपयोग करके चक्र काउंटर को सीधे पढ़ सकते हैं ।