2014-06-17 5 views
7

मैं इंटेल इंट्रिनिक्स का उपयोग कर एक प्रोग्राम लिख रहा हूं। मैं _mm_permute_pd आंतरिक का उपयोग करना चाहता हूं, जो केवल एवीएक्स के साथ सीपीयू पर उपलब्ध है। AVX के बिना CPUs के लिए मैं _mm_shuffle_pd का उपयोग कर सकता हूं लेकिन चश्मा के अनुसार यह _mm_permute_pd से बहुत धीमा है।यदि एवीएक्स एक्सटेंशन सीपीयू द्वारा समर्थित है तो इंटेल इंट्रिनिक्स के साथ कैसे जांचें?

#ifdef __IS_AVX_SUPPORTED__ // is there sth like this defined? 
// use _mm_permute_pd 
# else 
// use _mm_shuffle_pd 
#endif 

: इतना है कि मैं इस तरह sth लिख सकते हैं इंटेल intrinsics के लिए शीर्षक फ़ाइलें स्थिरांक है कि मुझे AVX समर्थित है या नहीं पहचान करने में सहायता परिभाषित करते हैं? मुझे this tutorial मिला है, जो दिखाता है कि रनटाइम चेक कैसे करें लेकिन मुझे वर्तमान मशीन के लिए एक स्थिर, संकलन-समय की जांच करने की आवश्यकता है।

+0

'_mm_permute_pd' (' vpermilpd') 'shufpd dest, same, same' से तेज़ नहीं है, जब तक कि यह स्मृति स्रोत ऑपरेंड को निर्देश में फोल्ड करने की अनुमति न दे। निर्देश तालिकाओं के लिए http://agner.org/optimize/ देखें। –

उत्तर

5

मुझे लगता है कि आप इंटेल सी ++ कंपाइलर का उपयोग कर रहे हैं। इस मामले में - हाँ, ऐसे मैक्रोज़ हैं: Intel C++ Compiler Reference Guide: __AVX__, __AVX2__

पीएस ध्यान रखें कि यदि आप AVX निर्देश सेट सक्षम के साथ एप्लिकेशन को संकलित करते हैं तो यह एवीएक्स का समर्थन नहीं कर रहे CPUs पर असफल हो जाएगा। यदि आप अपने सॉफ़्टवेयर को स्रोत कोड पैकेज के रूप में वितरित करने जा रहे हैं और लक्ष्य मशीन पर संकलित कर रहे हैं - यह एक व्यवहार्य समाधान हो सकता है। अन्यथा आपको गतिशील रूप से AVX की जांच करनी चाहिए।

पी.पी.एस. आईसीसी के लिए कई विकल्प हैं। following compiler options पर एक नज़र डालें और इसके संदर्भ भी दूसरे से देखें।

+0

जीसीसी मौजूदा सीपीयू के आधार पर निर्देश सेट को ट्यून करने के लिए '-mtune = native' का समर्थन करता है, शायद आईसीसी के लिए कुछ ऐसा ही है? – peppe

+0

हां, विंडोज़ के लिए मैकोज़ और लिनक्स और '/ QxHost' के लिए' -xHost' है। '-मार्क', '-arch' आदि जैसे कई विकल्प भी हैं। – Romeo

5

जीसीसी, आईसीसी, एमएसवीसी, और क्लैंग सभी एक मैक्रो __AVX__ परिभाषित करते हैं जिसे आप जांच सकते हैं। असल में यह उन सभी कंपाइलर्स (MSVC is the one that breaks the mold) द्वारा परिभाषित एकमात्र सिम स्थिर है। यह केवल आपको बताता है कि क्या आपका कोड AVX समर्थन के साथ संकलित किया गया था (उदा। एमसीसी के साथ एमएसीसी या/आर्क: एमएसवीसी के साथ एवीएक्स) यह आपको नहीं बताता है कि आपका सीपीयू AVX का समर्थन करता है या नहीं। अगर आप जानना चाहते हैं कि सीपीयू एवीएक्स का समर्थन करता है तो आपको CPUID की जांच करने की आवश्यकता है। यहां, asm-in-c-error, उन सभी कंपाइलरों से CPUID पढ़ने के लिए एक उदाहरण है।

यह ठीक से करने के लिए मेरा सुझाव है कि आप CPU dispatcher बनाएं।

संपादित करें: मामले में किसी को भी कैसे पता लगाने के लिए CPUID से मानों का उपयोग कर देख https://github.com/Mysticial/FeatureDetector

0

मुझे ऐसा लगता है कि एक ही रास्ता संकलन और एक प्रोग्राम है जो कि क्या पहचान करता है चलाने के लिए है अगर AVX उपलब्ध है जानना चाहता है एवीएक्स उपलब्ध है। फिर मैन्युअल रूप से या स्वचालित रूप से AVX फ़ंक्शंस के साथ या उसके बिना अलग कोड संकलित करें। वीएस 2013 के लिए, मैं हैएएएक्स (या नहीं) की पहचान करने के लिए निम्नलिखित में कमांडएवीएक्स फ़ोल्डर में अपना कोड इस्तेमाल करता हूं और उचित प्रोग्राम को संकलित और लिंक करने के लिए दो अलग-अलग बीएटी फ़ाइलों में से एक को निष्पादित करने के लिए इसका उपयोग करता हूं। AVX:

http://www.roylongbottom.org.uk/gigaflops-benchmarks.zip

मेरा प्रश्न जैसे/मेहराब उपयुक्त संकलन विकल्प के उपयोग के संबंध में एक समाधान की पहचान में मदद करने के लिए किया गया था।

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