मैं एक परियोजना के लिए जीसीसी सिम वेक्टर एक्सटेंशन का उपयोग कर रहा हूं, सब कुछ काफी अच्छी तरह से काम करता है लेकिन रहता है, वे बस वेक्टर के सभी घटकों को रीसेट करते हैं।जीसीसी में तैरने के लिए सिमड इंट वैक्टर को कैसे डाला जाए?
manual कहता है:
यह एक से दूसरे वेक्टर प्रकार से कास्ट करने के लिए संभव है, बशर्ते कि वे (एक ही आकार के होते हैं, वास्तव में, आप भी करने के लिए और एक ही के अन्य डेटाटाइप्स से वैक्टर डाल सकता आकार)।
#include <stdio.h> typedef int int4 __attribute__ ((vector_size(sizeof(int) * 4))); typedef float float4 __attribute__ ((vector_size(sizeof(float) * 4))); int main() { int4 i = { 1 , 2 , 3 , 4 }; float4 f = { 0.1 , 0.2 , 0.3 , 0.4 }; printf("%i %i %i %i\n" , i[0] , i[1] , i[2] , i[3]); printf("%f %f %f %f\n" , f[0] , f[1] , f[2] , f[3]); f = (float4)i; printf("%f %f %f %f\n" , f[0] , f[1] , f[2] , f[3]); }
gcc cast.c -O3 -o cast
साथ संकलन और मेरे मशीन पर चल रहा प्राप्त:1 2 3 4 0.100000 0.200000 0.300000 0.400000 0.000000 0.000000 0.000000 0.000000 <-- no no no
मुझे लगता है कि कोडांतरक गुरु नहीं कर रहा हूँ, लेकिन मैं सिर्फ कुछ बाइट आंदोलनों को देखने
यहाँ एक सरल उदाहरण है यहां:
[...] 400454: f2 0f 10 1d 1c 02 00 movsd 0x21c(%rip),%xmm3 40045b: 00 40045c: bf 49 06 40 00 mov $0x400649,%edi 400461: f2 0f 10 15 17 02 00 movsd 0x217(%rip),%xmm2 400468: 00 400469: b8 04 00 00 00 mov $0x4,%eax 40046e: f2 0f 10 0d 12 02 00 movsd 0x212(%rip),%xmm1 400475: 00 400476: f2 0f 10 05 12 02 00 movsd 0x212(%rip),%xmm0 40047d: 00 40047e: 48 83 c4 08 add $0x8,%rsp 400482: e9 59 ff ff ff jmpq 4003e0
मैं स्केलर के वेक्टर समकक्ष का निरीक्षण करें:
*(int *)&float_value = int_value;
आप इस व्यवहार को कैसे समझा सकते हैं?
हाँ, यह है कि यह क्या लगता है कि क्या हो रहा है है। (या बल्कि, कोई रूपांतरण नहीं) तो आपको वास्तविक मूल्य रूपांतरण की बजाय 4 denormalized floats मिलते हैं। – Mysticial
वही है जो वेक्टर कास्ट करने के लिए परिभाषित किया गया है (कुछ भी पूरी तरह से बोनर होगा, और मानक वेक्टर प्रोग्रामिंग मुहावरे लिखने के लिए बहुत दर्दनाक होगा)। यदि आप वास्तव में रूपांतरण प्राप्त करना चाहते हैं, तो आप शायद कुछ प्रकार के अंतर्निहित का उपयोग करना चाहेंगे, जैसे '_mm_cvtepi32_ps' (यह आपके वेक्टर कोड की अच्छी वास्तुशिल्प आजादी को तोड़ देता है, जो भी परेशान है; एक आम दृष्टिकोण है एक अनुवाद शीर्षलेख का उपयोग करने के लिए जो "intrinsics" के पोर्टेबल सेट को परिभाषित करता है)। –
मैं आपका बिंदु देख सकता हूं, लेकिन सवाल बन गया: यह _cast_ कब उपयोगी होगा? – cYrus