2012-06-20 14 views
16

मैं दो __m128 मानों को एक __m256 पर जोड़ना चाहता हूं।दो __m128 मानों को __m256 में कैसे जोड़ें?

कुछ इस तरह:

__m256 c = { 1, 2, 3, 4, 5, 6, 7, 8 }; 

किसी भी intrinsics है कि मैं यह करने के लिए उपयोग कर सकते हैं देखते हैं:

__m128 a = _mm_set_ps(1, 2, 3, 4); 
__m128 b = _mm_set_ps(5, 6, 7, 8); 

की तरह कुछ के लिए?

उत्तर

21

यह आप क्या चाहते हैं करना चाहिए: आदेश तुम क्या चाहते से उलट है

__m128 a = _mm_set_ps(1,2,3,4); 
__m128 b = _mm_set_ps(5,6,7,8); 

__m256 c = _mm256_castps128_ps256(a); 
c = _mm256_insertf128_ps(c,b,1); 

है, तो सिर्फ a और b स्विच करें।


ब्याज की आंतरिक _mm256_insertf128_ps जो आपको एक 128 बिट या तो कम या एक 256-बिट AVX रजिस्टर के ऊपरी हिस्से में रजिस्टर सम्मिलित करने देगा है:

http://software.intel.com/sites/products/documentation/studio/composer/en-us/2011/compiler_c/intref_cls/common/intref_avx_insertf128_ps.htm

की पूरी परिवार उन्हें यहां है:

+1

विजुअल स्टूडियो के कुछ संस्करण (निश्चित रूप से 2010, संभवतः कुछ बाद वाले लोगों) में _mm256_castps128_ps256 के हैंडलिंग में एक बग है, इसलिए यह कोड उन पर क्रैश होने की संभावना है। Http://connect.microsoft.com/VisualStudio/feedback/details/653771/mm256-castps128-ps256-does-unaligned-read देखें। यदि आपको उन कंपाइलरों पर काम करने के लिए अपने कोड की आवश्यकता है, तो आपको उपयोगकर्ता 1584773 द्वारा प्रदान किए गए समाधान का उपयोग करना होगा जो इसे एक सम्मिलित के साथ बदल देता है। – peastman

+0

ध्यान दें कि इसका परिणाम '__m256 {4, 3, 2, 1, 8, 7, 6, 5}' '__m256 {1, 2, 3, 4, 5, 6, 7, 8}' के बजाय होता है। मुझे लगता है कि ओपी '_mm_set_ps' के बजाय' _mm_setr_ps' का उपयोग करना चाहता था। – plasmacel

3

यहां तक ​​कि इस एक काम करेंगे:

__m128 a = _mm_set_ps(1,2,3,4); 
__m128 b = _mm_set_ps(5,6,7,8); 

__m256 c = _mm256_insertf128_ps(c,a,0); 
c = _mm256_insertf128_ps(c,b,1); 

आप एक चेतावनी मिल जाएगा के रूप में सी आरंभ नहीं किया है, लेकिन आप इसे अनदेखा कर सकते हैं और करेंगे आप अभिनय के लिए इस समाधान देख रहे हैं कम घड़ी चक्र का उपयोग करें तो दूसरा।

+1

क्या आप वाकई मेरे रहस्यमय प्रस्ताव के समाधान से तेज़ हैं? जहां तक ​​मुझे पता है कि castps128_ps256 मुफ़्त है, है ना? इसके अलावा, मेरे आवेदन को डालने के बजाय कास्ट का उपयोग करने से बहुत लाभ होता है (निकालने के लिए भी जाता है)। – user1829358

2

भी दूसरे स्थान पर रखना आंतरिक उपयोग कर सकते हैं:

__m128 a = _mm_set_ps(1,2,3,4); 
__m128 b = _mm_set_ps(5,6,7,8); 
__m256 c = _mm256_permute2f128_ps(_mm256_castps128_ps256(a), _mm256_castps128_ps256(b), 0x20); 

मैं नहीं जानता कि किस तरफ तेजी से होता है।

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