2017-07-28 11 views
23

1000 से अधिक पंक्तियों और 10 के कॉलम के साथ दो int matrices ए और बी होने के बाद, मुझे अक्सर उन्हें गतिरोध (4x या अधिक) प्राप्त करने के लिए फ़्लोट मैट्रिस में परिवर्तित करने की आवश्यकता होती है।int int int की तुलना में फ्लोट मैट्रिक्स गुणा द्वारा फ़्लोट करने के लिए तेज़ क्यों है?

मुझे आश्चर्य है कि यह मामला क्यों है? मुझे एहसास है कि फ्लोट मैट्रिक्स गुणा के साथ चल रहे एवीएक्स आदि जैसे बहुत सारे अनुकूलन और वेक्टरेशन हैं। लेकिन फिर भी, पूर्णांक के लिए ऐसे AVX2 निर्देश हैं (यदि मुझे गलत नहीं है)। और, क्या कोई पूर्णांक के लिए एसएसई और एवीएक्स का उपयोग नहीं कर सकता?

मैट्रिक्स बीजगणित पुस्तकालयों जैसे कि नम्पी या ईजिन के नीचे एक ह्युरिस्टिक क्यों नहीं है और इसे पूर्ण करने के लिए पूर्णांक पूर्णांक मैट्रिक्स गुणा निष्पादित करता है?

स्वीकार किए जाते हैं जवाब के बारे में: जबकि @ Sascha का जवाब बहुत जानकारीपूर्ण और प्रासंगिक है, @ chatz के जवाब वास्तविक कारण है कि पूर्णांक गुणन द्वारा int की BLAS पूर्णांक मैट्रिक्स आपरेशन मौजूद है कि क्या पर ध्यान दिए बिना धीमी है।

+5

इससे सवाल अधिक विशिष्ट बनाने में मदद मिलेगी, लेकिन अधिक से अधिक लोगों को इसे फ्लोट के लिए जरूरी है, इसलिए इसे फ्लोट (सॉफ़्टवेयर और हार्डवेयर दोनों में) के अनुकूल बनाने के लिए अधिक प्रयास किए गए थे। –

+0

प्रदर्शन अंतर को प्रदर्शित करने के लिए इस प्रश्न को एक विशिष्ट उदाहरण कोड की आवश्यकता है (देखें [mcve])। विशेष रूप से दिया गया है कि कोड टैग किया गया है [सी ++] और [numpy] यह पूरी तरह अस्पष्ट है कि आप क्या कह रहे हैं। – Zulan

उत्तर

9

आप इन दो सरल कार्य करता है जो अनिवार्य रूप से सिर्फ एक उत्पाद की गणना (Eigen लाइब्रेरी का उपयोग कर)

#include <Eigen/Core> 

int mult_int(const Eigen::MatrixXi& A, Eigen::MatrixXi& B) 
{ 
    Eigen::MatrixXi C= A*B; 
    return C(0,0); 
} 

int mult_float(const Eigen::MatrixXf& A, Eigen::MatrixXf& B) 
{ 
    Eigen::MatrixXf C= A*B; 
    return C(0,0); 
} 

झंडे -mavx2 -S -O3 आप पूर्णांक और नाव संस्करण के लिए बहुत समान कोडांतरक कोड देखेंगे, का उपयोग कर संकलन है। मुख्य अंतर हालांकि vpmulld में विलंबता 2-3 गुणा है और vmulps के थ्रूपुट के केवल 1/2 या 1/4 है। (हाल ही में इंटेल आर्किटेक्चर पर)

संदर्भ: Intel Intrinsics Guide, "थ्रूपूट" का अर्थ पारस्परिक थ्रूपुट है, यानी, यदि कोई विलंबता नहीं होती है (कुछ हद तक सरलीकृत), तो ऑपरेशन के दौरान कितने घड़ी चक्र का उपयोग किया जाता है।

+0

बहुत दिलचस्प! थ्रूपुट और विलंबता के मामले में कभी भी 'vpmulld' और' vmulps' यह अलग नहीं हो सकता था। – NULL

+0

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

13

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

Here is some branch of OpenBLAS इस पर काम कर रहा है (और कुछ tiny discussion at google-groups linking it)।

और मुझे लगता है कि मैंने इंटेल के एमकेएल (इंटेल के बीएलएएस कार्यान्वयन) might be working on integer-types too सुना है। This talk दिलचस्प लग रहा है (उस मंच में उल्लिखित), हालांकि यह छोटा है और शायद छोटे अभिन्न प्रकार एम्बेडेड डीप-लर्निंग में उपयोगी है)।

+1

ऐसा लगता है कि [ब्लेज़] (https://bitbucket.org/blaze-lib/blaze) पूर्णांक का समर्थन करता है – NathanOliver

+1

ईजिन पूर्णांक के साथ काम करता है, और जब आप इसे 'g ++ -O3 -march = somerecent' के साथ संकलित करते हैं तो यह सदिश होता है और आप देखते हैं 'vpmulld' जैसे निर्देश। –

+0

पूर्णांक-ऑप्स का समर्थन और वेक्टरिंग संभव है (और मैं इसे उच्च गुणवत्ता वाले libs में उम्मीद करता हूं), लेकिन सवाल यह है: क्या यह हाथ से ट्यून किए गए बीएलएएस कोड के साथ प्रतिस्पर्धा कर सकता है? – sascha

संबंधित मुद्दे