2013-06-13 5 views
6

SSE के साथ के लिए 256-बिट बराबर आप आंतरिक _mm_load1_ps()AVX _mm_load1_ps

AVX साथ 256 बिट विस्तृत SIMD का उपयोग करते समय के साथ एक __m128 के सभी 4 स्लॉट में स्मृति से एक भी नाव लोड कर सकते हैं, वहाँ हो रहा है कोई _mm256_load1_ps() वेक्टर के सभी 8 स्लॉट में स्मृति से एक ही फ्लोट लोड करने के लिए।

यह चूक क्यों है, और इसके आसपास सबसे अच्छा तरीका क्या है?

या इससे भी बेहतर: वेक्टर के लक्षित स्लॉट 0..7 पर एक ही फ्लोट लोड करने का कोई तरीका है?

+0

एवीएक्स और एवीएक्स 2 अभी भी आपको कम 128 ('पिनएसआरडी '/' INSERTPS': तत्व संख्या = संकलन-समय स्थिरांक में तत्वों को सम्मिलित करने की अनुमति देता है)। ऊपरी 128 को शून्य किए बिना ऐसा करना गैर-वेक्स एन्कोडिंग के साथ ही संभव है, जो इंटेल प्री-स्काइलेक पर भारी मात्रा में मंदी को VEX और गैर-VEX निर्देशों को मिलाकर ट्रिगर करता है। आप extractf128, insertps, insertf128 कर सकते हैं। –

+0

'_mm_load1_ps' एक फ्लोट प्रसारित करने के लिए 'movss' + shuffle के लिए एक समग्र आंतरिक है। यदि आप पहले से ही कंपाइलर को रजिस्टर में स्थिर होने की तरह महसूस करने के लिए तैयार थे, तो '_mm256_set1_ps (* f) 'एक अच्छी पसंद है। स्मार्ट कंपाइलर्स उपयुक्त होने पर 'VBROADCASTSS 'उत्सर्जित करेंगे। –

उत्तर

9

_mm256_broadcast_ss जो आप खोज रहे हैं वह है।

+0

शायद मैं कुछ गलत समझ सकता हूं, लेकिन _mm256_set1_ps (* x) क्यों नहीं? http://stackoverflow.com/questions/13218391/is-mm-broadcast-ss-faster-than-mm-set1-ps –

+2

_mm256_set1_ps (* x) भी काम करेगा, लेकिन यह कई निर्देश उत्पन्न कर सकता है। _mm256_broadcast_ss केवल एक निर्देश उत्पन्न करने की गारंटी है, VBROADCASTSS –

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