2013-04-23 4 views
5

के बीच कोई प्रदर्शन अंतर मेरे पास कोड है जो मुख्य रूप से एकल-परिशुद्धता फ़्लोटिंग पॉइंट संख्याओं के साथ काम करता है। पारस्परिक कार्यों के लिए कॉल काफी बार होता है। अभी, मैं पाप(), cos(), sqrt(), आदि का उपयोग कर रहा हूं - जो फ़ंक्शन स्वीकार करते हैं और double लौटाते हैं। जब इसे केवल x87 के लिए संकलित किया जाता है, तो मुझे पता है कि एकल और डबल परिशुद्धता के बीच कोई अंतर नहीं है। मैंने एग्नेर फोग की ऑप्टिमाइज़ेशन गाइड में पढ़ा है हालांकि एसएसई निर्देशों का उपयोग करने वाले इन फ़ंक्शन के सॉफ़्टवेयर संस्करण एकल-परिशुद्धता फ़्लोटिंग पॉइंट नंबरों के लिए तेज़ हैं।sinf(), cosf() और sin(), cos()

float x = 1.23; 
float y = sin(x); 

या गोलाई नियम इस तरह के एक अनुकूलन रोकता है:

मेरा प्रश्न है, जब यह की तरह कुछ का सामना करना पड़ता है कि क्या संकलक स्वचालित रूप से तेजी से समारोह का प्रयोग करेंगे है?

केवल खोज-और-प्रतिस्थापन करने के लिए पर्याप्त आसान होगा और देखें कि कोई प्रदर्शन लाभ है या नहीं। समस्या यह है कि मुझे इन कार्यों के लिए पॉइंटर्स की भी आवश्यकता है। एमएसवीसी में, sinf(), cosf(), और दोस्तों इनलाइन फ़ंक्शन हैं। इसलिए उनका उपयोग करने के लिए जिमनास्टिक की थोड़ी आवश्यकता होगी। प्रयास करने से पहले, मैं जानना चाहता हूं कि यह सार्थक है या नहीं।

एमएसवीसी के अलावा, मैं जीसीसी को भी लक्षित कर रहा हूं।

+1

क्या आप वाकई इन कार्यों को कॉल करते हैं, वास्तव में एक मंदी और मूल्य बर्बाद करने के लायक हैं? क्या आपका अपना प्रोफाइल प्रोफाइल है? –

उत्तर

3

sin पर कॉल करते समय कलाकार को वास्तव में कोई आवश्यकता नहीं है। वास्तव में यह प्रतिकूल होगा यदि आप C12 के साथ आने वाले <tgmath.h> शीर्षलेख का उपयोग करेंगे। इससे आपको जेनेरिक मैक्रोज़ मिलते हैं जो आपके तर्क के अनुसार सही कार्य चुनते हैं, दुर्भाग्यवश लक्ष्य प्रकार के लिए नहीं। तो अगर आपको लगता है कि शीर्ष लेख (यकीन नहीं अगर यह एमएस के लिए उपलब्ध है) का उपयोग करेंगे

float x = 1.23; 
float y = sin(x); 

स्वचालित रूप से हुड के नीचे sinf का प्रयोग करेंगे।

+0

आप सही हैं। कलाकार के साथ संकलक सोचेंगे कि इनपुट वास्तव में एक डबल है। मैंने इसे सवाल से बाहर निकाला। – cleong

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