SSE3 में, PALIGNR अनुदेश निम्नलिखित प्रदर्शन 128 बिट। नैवली, मुझे विश्वास था कि अंतर्निहित कार्य _mm256_alignr_epi8
(VPALIGNR) उसी ऑपरेशन को _mm_alignr_epi8
केवल 256 बिट रजिस्टरों पर करता है। अफसोस की बात है, हालांकि, यह बिल्कुल मामला नहीं है। वास्तव में, _mm256_alignr_epi8
256 बिट रजिस्टर को 2 128 बिट रजिस्ट्रार के रूप में मानता है और दो पड़ोसी 128 बिट रजिस्टरों पर 2 "संरेखण" संचालन करता है। _mm_alignr_epi8
के रूप में एक ही ऑपरेशन को प्रभावी ढंग से प्रदर्शन करना, लेकिन एक बार में 2 रजिस्टरों पर। यह सबसे स्पष्ट रूप से यहाँ सचित्र है: _mm256_alignr_epi8_mm_alignr_epi8 (PALIGNR) AVX2 में बराबर
वर्तमान में मेरे समाधान है _mm_alignr_epi8
का उपयोग कर रखने के लिए YMM (256 बिट) पंजीकृत करता विभाजित करके दो XMM (128 बिट) रजिस्टरों (हाई और लो) में है, इसलिए जैसे:
__m128i xmm_ymm1_hi = _mm256_extractf128_si256(ymm1, 0);
__m128i xmm_ymm1_lo = _mm256_extractf128_si256(ymm1, 1);
__m128i xmm_ymm2_hi = _mm256_extractf128_si256(ymm2, 0);
__m128i xmm_ymm_aligned_lo = _mm_alignr_epi8(xmm_ymm1_lo, xmm_ymm1_hi, 1);
__m128i xmm_ymm_aligned_hi = _mm_alignr_epi8(xmm_ymm2_hi, xmm_ymm1_lo, 1);
__m256i xmm_ymm_aligned = _mm256_set_m128i(xmm_ymm_aligned_lo, xmm_ymm_aligned_hi);
यह काम करता है, लेकिन एक बेहतर तरीका होना चाहिए, है ना? क्या कोई और अधिक "सामान्य" AVX2 निर्देश है जिसका उपयोग एक ही परिणाम प्राप्त करने के लिए किया जाना चाहिए?
yup, यह वही समाधान है। लेकिन अगर यह एकमात्र तरीका है तो यह AVX2 निर्देश – eladidan
के डिजाइनरों द्वारा बड़ी निगरानी की तरह लगता है, मैं इसे संकलित करने के लिए नहीं मिला ... मुझे संकलन त्रुटि मिलती है: "आपदात्मक त्रुटि: आंतरिक पैरामीटर तत्काल मान होना चाहिए" निम्नलिखित पंक्ति पर: "__m128i vouth = _mm_alignr_epi8 (v0l, v0h, n);"। जाहिर है, क्योंकि एन एक immidiate नहीं है। आप इसे कैसे बाईपास करने में सक्षम थे? मैं इंटेल सी ++ कंपाइलर – eladidan
का उपयोग कर रहा हूं, यह मेरे लिए काम करता है, जब तक कि एन संकलन-समय स्थिर रहता है - मैं भी इंटेल आईसीसी कंपाइलर का उपयोग कर रहा हूं, लेकिन सी ++ के बजाय सी के रूप में संकलित करता हूं यदि इससे कोई फर्क पड़ता है, और यह भी जीसीसी के साथ मेरे लिए काम करता है। –