मैंने कई एसएसई कंपाइलर इंट्रिनिक्स का उपयोग करके एक 3 डी वेक्टर क्लास लिखा है। सब कुछ ठीक काम करता है जब तक कि मैंने 3 डी वेक्टर वाले वर्गों को नए के साथ सदस्य के रूप में स्थापित करना शुरू नहीं किया। मैंने रिलीज मोड में अजीब दुर्घटनाओं का अनुभव किया लेकिन डीबग मोड में नहीं और दूसरी तरफ।एसएसई, इंट्रिनिक्स, और संरेखण
तो मैंने कुछ लेख पढ़े और अनुमान लगाया कि मुझे 3 डी वेक्टर वर्ग के उदाहरण के 16 वर्गों के लिए कक्षाओं को संरेखित करने की आवश्यकता है। तो मैं सिर्फ इतना की तरह वर्गों के सामने _MM_ALIGN16
(__declspec(align(16)
) कहा:
_MM_ALIGN16 struct Sphere
{
// ....
Vector3 point;
float radius
};
कि पहली बार में इस मुद्दे को हल करने के लिए लग रहा था। लेकिन कुछ कोड बदलने के बाद मेरा प्रोग्राम फिर से अजीब तरीके से दुर्घटनाग्रस्त हो गया। मैंने वेब पर कुछ और खोज की और blog आलेख मिला। मैंने कोशिश की कि लेखक, अर्न्स्ट हॉट ने समस्या को हल करने के लिए क्या किया और यह मेरे लिए भी काम करता है। मैं नया जोड़ा गया है और इस तरह मेरी वर्गों के लिए ऑपरेटरों को हटा दें:
_MM_ALIGN16 struct Sphere
{
// ....
void *operator new (unsigned int size)
{ return _mm_malloc(size, 16); }
void operator delete (void *p)
{ _mm_free(p); }
Vector3 point;
float radius
};
अर्नस्ट कहा गया है कि इस aproach के साथ-साथ कई समस्याएं खड़ी कर सकता है, लेकिन वह सिर्फ एक मंच है जो समझा क्यों यह समस्याग्रस्त किया जा सकता बिना अब मौजूद नहीं है से जोड़ता है।
तो मेरी प्रश्न हैं:
ऑपरेटरों परिभाषित करने के साथ समस्या क्या है?
कक्षा परिभाषा में
_MM_ALIGN16
क्यों नहीं जोड़ रहा है?एसएसई इंट्रिनिक्स के साथ आने वाले संरेखण के मुद्दों को संभालने का सबसे अच्छा तरीका क्या है?
पहले मामले में, क्या आप अपने ढांचे को ढेर या ढेर पर आवंटित कर रहे हैं? मुझे यकीन नहीं है कि मॉलोक डिफ़ॉल्ट रूप से गठबंधन स्मृति को लौटाता है, जबकि _mm_malloc निश्चित रूप से होगा - "कुछ समय बाद मेरा प्रोग्राम फिर से क्रैश करना शुरू हुआ" का क्या मतलब है? क्या इसका मतलब यह है कि इसे थोड़ा सा चलने के बाद (और यह क्या कर रहा था)? – Thomas
समस्या तब शुरू हुई जब मैंने ढेर पर structs आवंटित करना शुरू किया। "थोड़ी देर के बाद" वाक्य के साथ मेरा मतलब है कि कोड बदलने के बाद यह दुर्घटनाग्रस्त हो गया। मुझे लगता है कि संरेखण दुर्घटना से सही था और फिर मैंने इसे नष्ट कर दिया। मुझे लगता है कि मॉलोक स्मृति 16 बाइट गठबंधन वापस नहीं करता है जो मुझे लगता है कि समस्या है। मेरा सवाल वास्तव में ऑपरेटर दृष्टिकोण के साथ समस्या क्या है और एसएसई इंट्रिनिक्स का उपयोग कर कोड प्रबंधित करने का सबसे अच्छा तरीका क्या है। –
वास्तव में आपको 'क्षेत्र 'के संरेखण को निर्दिष्ट करने की आवश्यकता नहीं है (इस' _MM_ALIGN16' चीज़ का उपयोग करके), क्योंकि संकलक पर्याप्त रूप से स्मार्ट है कि 'क्षेत्र' में 16-गठबंधन सदस्य हैं और स्वचालित रूप से 'क्षेत्र' को समायोजित करते हैं। एस संरेखण आवश्यकताओं (दिया गया है कि 'वेक्टर 3' सही ढंग से गठबंधन है)। यही कारण है कि आपको 'वेक्टर 3' को स्पष्ट रूप से संरेखित करने की आवश्यकता नहीं है, अगर उसके पास पहले से ही '__m128' सदस्य है। यह केवल गतिशील आवंटन है जो एक समस्या है और इसे 'ऑपरेटर न्यू/डिलीट' ओवरलोडिंग से दूर किया जा सकता है, जैसे कि ब्लॉग में लिखे गए (और आमतौर पर अतिरिक्त चीजें, जैसे 'std :: allocator')। –