2011-02-11 16 views
11

हाय सब :)
मैं फ्लोटिंग पॉइंट, सिमड/गणित इंट्रिनिक्स और जीसीसी के लिए फास्ट-मैथ फ्लैग के बारे में कुछ अवधारणाओं पर लटका पाने की कोशिश कर रहा हूं। अधिक विशेष रूप से, मैं x86 cpu पर gcc v4.5.0 के साथ MinGW का उपयोग कर रहा हूं।जीसीसी, सिमड इंट्रिनिक्स और फास्ट-गणित अवधारणाएं

मैं चारों ओर थोड़ी देर के लिए खोज की है अब, और कहा कि क्या मैं (लगता है कि मैं) इस समय को समझने है:

जब मैं कोई झंडे के साथ संकलन, किसी भी fp कोड मानक x87 हो जाएगा, कोई SIMD intrinsics, और math.h फ़ंक्शन msvcrt.dll से लिंक किए जाएंगे।

जब मैं mfpmath उपयोग करते हैं, mssen और/या मार्च ताकि MMX/SSE/AVX कोड सक्षम हो जाता है, जीसीसी वास्तव में, SIMD निर्देश केवल का उपयोग करता है, तो मैं भी कुछ अनुकूलन झंडे निर्दिष्ट पर की तरह या ftree-vectorize। इस मामले में अंतर्निहित जीसीसी द्वारा आंतरिक रूप से चुने गए हैं, और कुछ गणित कार्य (मैं अभी भी गणित पर मानक गणित funcs के बारे में बात कर रहा हूं) इनलाइन कोड द्वारा अंतर्निहित या ऑप्टिमाइज़ हो जाएगा, कुछ अन्य अभी भी msvcrt से आएंगे। dll। यदि मैं अनुकूलन झंडे निर्दिष्ट नहीं करता हूं, तो क्या इनमें से कोई भी परिवर्तन करता है?

जब मैं विशिष्ट SIMD डेटा प्रकार का उपयोग करें (उन जीसीसी एक्सटेंशन के रूप में उपलब्ध है, जैसे v4si या v8qi), मैं फिर से सीधे आंतरिक funcs कॉल करने के लिए, या जीसीसी के लिए automagic निर्णय छोड़ विकल्प होता है। यदि मैं उचित झंडे के माध्यम से सिमड निर्देश सक्षम नहीं करता हूं तो जीसीसी अभी भी मानक x87 कोड चुन सकता है। फिर, अगर मैं अनुकूलन झंडे निर्दिष्ट नहीं करता हूं, तो क्या इनमें से कोई भी परिवर्तन करता है?

आपने जो मुझे ठीक कर लें मेरा कोई भी कथन गलत है: पी

अब सवाल:

  1. मैंने कभी intrinsics का उपयोग करने के x86intrin.h शामिल करने के लिए है?
  2. क्या मुझे कभी भी libm को लिंक करना होगा?
  3. किसी भी चीज़ के साथ तेजी से गणित करना क्या है? मैं समझता हूं कि यह आईईईई मानक को आराम देता है, लेकिन, विशेष रूप से, कैसे? अन्य मानक कार्यों का उपयोग किया जाता है? कुछ अन्य lib जुड़ा हुआ है? या बस कुछ झंडे सेट हैं और मानक lib अलग तरीके से व्यवहार करता है?

किसी के लिए धन्यवाद, जो मदद करने के लिए जा रहा है: डी

+0

जीसीसी पुस्तिका 3. यहां एक उदाहरण के लिए देखें: http://stackoverflow.com/questions/4956033/multiply-by-0-optimization – Anycorn

उत्तर

6

ठीक है, मैं किसी को जो मेरे जैसे इन अवधारणाओं को समझ थोड़ा संघर्ष कर रहा है के लिए ansewring कर रहा हूँ। कोड, एफपीयू या SSE के किसी भी प्रकार पर बैल काम के साथ

अनुकूलन

तेजी से गणित केवल x87 कोड पर काम करने लगता है। इसके अलावा, यह हमेशा शामिल हैं o_O

Builtins एफपीयू नियंत्रण शब्द बदलने के लिए प्रतीत नहीं होता। कुछ व्यवहारों जैसे सख्त या नो-बिल्टिन के साथ, कुछ बिल्टिन के लिए इस व्यवहार से बचा जा सकता है।

libm।एक ऐसी चीज के लिए प्रयोग की जाती है जो ग्लिब में शामिल नहीं है, लेकिन मिंगव के साथ यह सिर्फ एक डमी फ़ाइल है, इसलिए फिलहाल इसे लिंक करने के लिए बेकार है

जीसीसी के विशेष वेक्टर प्रकारों का उपयोग केवल तभी उपयोगी होता है जब कॉलिंग सीधे इंट्रिनिक्स, अन्यथा कोड वैसे भी वेक्टरकृत हो जाता है।

किसी भी सुधार का स्वागत किया है :)

उपयोगी लिंक्स:
fpu/sse control
gcc math
और "वेक्टर एक्सटेंशन" "X86 निर्मित कार्यों" और "अन्य Builtins"

+0

क्योंकि जीसीसी अब v4.7 पर है, जैसा कि मैंने अंत में लिखा था, किसी भी सुधार का अभी भी स्वागत है:) – rocket441

+0

32-बिट x86 पर जीसीसी के लिए, आपको '-msse2' या ' -मार्क = एसएसई/एसएसई 2 गणित के उपयोग को सक्षम करने के लिए जो भी हो। फिर संकलक को वास्तव में इसका उपयोग करने के लिए, आप '-mfpmath = sse' का उपयोग करते हैं। x86-64 पर gcc पहले से ही फ्लोट/डबल के लिए एसएसई/एसएसई 2 का उपयोग करता है, क्योंकि एबीआई एक्सएमएम रजिस्टरों में फ्लोट और डबल तर्क देता है, न कि x87 स्टैक। –

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