c - Union with __m256 and array of two __m128 -
क्या मुझे इस तरह से एक संघ हो सकता है
union eight_floats_t {__m256a; __ एम 128 बी [2]; }; आठ_floats_t आठ_फ्लोट; 256 बिट रजिस्टर के दो 128 बिट भागों तक त्वरित पहुँच प्राप्त करने के लिए?
संपादित करें: मैं इस दृष्टिकोण के प्रदर्शन के प्रभाव को समझने के लिए कह रहा था। / P>
आप निश्चित रूप से ऐसा कर सकते हैं सी और सी ++ भाषाओं आपको यह करने की अनुमति देते हैं। और यह सबसे अधिक संभावना होगी जो आप इसे करना चाहते हैं।
हालांकि, यह तथ्य कि आप AVX का उपयोग कर रहे हैं इसका मतलब है कि आप प्रदर्शन के बारे में ध्यान रखते हैं। तो यह जानना उपयोगी हो सकता है कि यह सबसे सामान्य (प्रदर्शन) जाल में से एक है जो एसएसई प्रोग्रामर में पड़ता है (और कई नोटिस नहीं करते हैं)
समस्या 1: वर्तमान कंपलर्स ऐसे मेमोरी स्थान का उपयोग कर एक संघ को लागू करते हैं। इसलिए यह पहली समस्या है, हर बार जब आप एक अलग क्षेत्र से संघ का उपयोग करते हैं, तो यह डेटा को स्मृति में बांटता है और इसे वापस पढ़ता है यह एक धीमा-डाउन है।
यह है कि एमएसवीसी 2, 2010 (ऑप्टिमाइज़ेशन के साथ) के लिए जेनरेट करता है:
आठ_फ्लोएट्स ए; A.a = वीका [0]; __ एम 128 एफवीसीए = ए.बी [0]; __m128 fvecB = a.b [1]; एफवीसीए = _mm_add_ps (एफवीसीए, एफवीसीबी); YMMWORD PTR vmovaps $ $ [rbp], ymm0 movaps xmm1, एक्सएमएमवर्ड्स पीटीआर एक $ [आरबीपी + 16] एडीप्स एक्सएमएम 1, एक्सएमएमवर्ड पीटीआर एक $ $ < [आरबीपी] एक्सएमएमवर्ड्स पीटीआर एफवीसीए $ [आरबीपी], एक्सएमएम 1 एमएमएसएसएस एक्सएमएम 1, डीडवर्ड्स पीटीआर एफवीसीए $ [आरबीपी] <पी> आप देख सकते हैं कि इसे मेमोरी में फ्लाई किया जा रहा है। समस्या 2: दूसरी धीमी गति से भी बदतर है जब आप मेमोरी के लिए कुछ लिखते हैं, और तुरंत इसे एक अलग शब्द-आकार के साथ एक्सेस करते हैं, तो आप स्टोर से लोड स्टॉल को ट्रिगर करेंगे। (आमतौर पर & gt; 10 चक्रों के क्रम पर)
इसका कारण यह है कि वर्तमान प्रोसेसर पर लोड स्टोअर कतार आम तौर पर इस (असामान्य) स्थिति को नियंत्रित करने के लिए डिज़ाइन नहीं किया जाता है। इसलिए वे कतारों को स्मृति में निस्तब्धता से निपटते हैं।
AVX डेटाटाइप्स के निचले और ऊपरी भाग तक पहुंचने का "सही" तरीका उपयोग करना है:
< Li> _mm256_extractf128_ps () -
_mm256_insertf128_ps () -
_mm256_castps256_ps128 () और परिवार इसी तरह अन्य आंकड़ों के लिए भी।
उस ने कहा, यह संभव है कि कंपाइलर काफी समझदार हो सकता है कि आप क्या कर रहे हैं और वैसे भी उन निर्देशों का उपयोग करें। (कम से कम MSVC2010 नहीं।)
Comments
Post a Comment