2015-09-07 6 views
9

इसलिए जब मैंने रूपांतरण शुरू किया और लक्ष्य को 'x64' पर सेट किया, तो मुझे 7 अनसुलझे बाहरी प्राप्त हुए। दो उदाहरण:__m64 संदर्भों के साथ एक सी ++ प्रोजेक्ट को x64 में परिवर्तित करना

error LNK2001: unresolved external symbol _m_empty ...CONVOLUTION_2D_USHORT.obj CONVOLUTION_2D_USHORT 
error LNK2001: unresolved external symbol _mm_setzero_si64 ...CONVOLUTION_2D_USHORT.obj CONVOLUTION_2D_USHORT 

तो मैं इन थोड़ा गहरा जांच कर की कोशिश की, और मैंने पाया कि यह हेडर फाइल के अंदर __m64 पसंद नहीं है: विशेष रूप से mmintrin.h (वहाँ दूसरों हो सकता है)। सी ++ के साथ मेरे शौकिया घंटे में, क्योंकि मैंने वर्षों में भाषा से गड़बड़ नहीं की है, (मैं आमतौर पर सी # विभाग में हूं), मैंने हेडर फाइलों को संपादित करने का प्रयास किया, और __m648 __m128i के साथ बदल दिया ?? !! यह नहीं पता कि यह और अन्य डीएलएल मशीनएक्स 64 के खिलाफ संकलित करने के लिए सही मार्ग क्या है। मेरे स्थानीय निर्देशिका में हेडर के स्रोत को संपादित करने और डालने के बाद, यह अभी भी मुझे राइट-क्लिक ... फिर से-एमेच्योर-घंटे के माध्यम से संकलित करने की अनुमति नहीं देता है। ऐसे कुछ लोग हैं जिन्होंने समान प्रश्न पूछे हैं, लेकिन मुझे मेरे लिए सही नहीं मिला।

यहाँ असमर्थित __m64 साथ 'mmintrin.h' का एक नमूना है ...

typedef union __declspec(intrin_type)_CRT_ALIGN(8) __m64 
{ 
unsigned __int64 m64_u64; 
float    m64_f32[2]; 
__int8    m64_i8[8]; 
__int16    m64_i16[4]; 
__int32    m64_i32[2]; 
__int64    m64_i64; 
unsigned __int8  m64_u8[8]; 
unsigned __int16 m64_u16[4]; 
unsigned __int32 m64_u32[2]; 
} __m64; 

/* General support intrinsics */ 
void _m_empty(void); 
__m64 _m_from_int(int _I); 
int _m_to_int(__m64 _M); 
__m64 _m_packsswb(__m64 _MM1, __m64 _MM2); 
__m64 _m_packssdw(__m64 _MM1, __m64 _MM2); 
__m64 _m_packuswb(__m64 _MM1, __m64 _MM2); 
__m64 _m_punpckhbw(__m64 _MM1, __m64 _MM2); 
__m64 _m_punpckhwd(__m64 _MM1, __m64 _MM2); 
__m64 _m_punpckhdq(__m64 _MM1, __m64 _MM2); 
__m64 _m_punpcklbw(__m64 _MM1, __m64 _MM2); 
__m64 _m_punpcklwd(__m64 _MM1, __m64 _MM2); 
__m64 _m_punpckldq(__m64 _MM1, __m64 _MM2); 
... 
+0

क्या आपको 2 अनसुलझा बाहरी या 7 मिलते हैं? –

+0

7 ..! Https: //drive.google.com/file/d/0B3qrpuwM39vmM1lGazR2WWhRamM/view? Usp = साझाकरण –

उत्तर

9

__m64 प्रकार प्रलेखन से:

__m64 डेटा प्रकार x64 प्रोसेसर पर समर्थित नहीं है। एमएमएक्स इंट्रिनिक्स के हिस्से के रूप में __m64 का उपयोग करने वाले अनुप्रयोगों को समकक्ष एसएसई और एसएसई 2 इंट्रिनिक्स का उपयोग करने के लिए फिर से लिखा जाना चाहिए।

http://msdn.microsoft.com/en-us/library/08x3t697(v=vs.110).aspx

तो यह है कि आप तीन विकल्प हैं दिखता है: 32 बिट, बंदरगाह SSE को MMX intrinsics, या एक गैर SIMD कार्यान्वयन करना प्रारंभ कर (के साथ चिपके रहते हैं अगर कोई है तो - तो अगर नहीं स्केलर कोड में पुनः कार्यान्वयन पर विचार करें)।

+0

एसएसई को एमएमएक्स इंट्रिनिक्स पोर्ट करें ... यह कैसे करें? लिंक ... क्या यह सीपीपी में संदर्भों को स्थानांतरित करने की चरणबद्ध प्रक्रिया है, या इसमें अधिक शामिल है? –

+1

@RobertKoernke: Intrinsics एक बहुत कम स्तर पर अमूर्तता पर काम करता है - कोई मैपिंग मौजूद नहीं है जो सभी एमएमएक्स संचालन के लिए सटीक समकक्ष प्रदान करता है। क्या आप जानते हैं कि उच्च abstraction स्तर 'valarray' अब सी ++ में मानकीकृत है? –

+1

कुछ भी अंतर्निहित ''__m64'' प्रकार का उपयोग करता है MMX या 3DNow! और इसलिए x64 मूल के लिए बहिष्कृत किया गया है। उम्मीद है कि कोड बेस में आंतरिक ऑप्टिमाइज्ड फ़ंक्शंस का सी ++ कार्यान्वयन है जिसे आप वापस आ सकते हैं, लेकिन किसी भी तरह से आपको एमएमएक्स को पोर्टेबल होने के लिए एसएसई के रूप में पुन: कार्यान्वित करना होगा। अच्छी खबर यह है कि एक बार ऐसा करने के बाद, यह अभी भी x86 के साथ ही x64 मूल के लिए बनाया जा सकता है। –

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