निम्नलिखित प्रश्न , संबंधित है लेकिन जवाब पुराने हैं, और उपयोगकर्ता से टिप्पणी मार्क Glisse पता चलता है कि इस समस्या यह है कि पर्याप्त रूप से विचार विमर्श नहीं किया जा सकता है के लिए सी के बाद से ++ 17 नए दृष्टिकोण हैं।
मैं SIMD के लिए ठीक से काम कर रही मेमोरी को प्राप्त करने की कोशिश कर रहा हूं, जबकि अभी भी सभी डेटा तक पहुंच है।
इंटेल पर, अगर मैं एक फ्लोट वेक्टर का प्रकार बनाता हूं __m256
, और 8 के कारक द्वारा मेरे आकार को कम करता हूं, तो यह मुझे संरेखित मेमोरी देता है।
उदाहरण के लिए std::vector<__m256> mvec_a((N*M)/8);
थोड़े हैक किए गए तरीके से, मैं फ्लोट करने के लिए वेक्टर तत्वों को संकेत दे सकता हूं, जो मुझे व्यक्तिगत फ्लोट मानों तक पहुंचने की अनुमति देता है।
इसके बजाय, मैं ऐसा करना पसंद करूंगा std::vector<float>
जो सही ढंग से संरेखित हो, और इस तरह से __m256
और अन्य सिमडी प्रकारों को बिना सेगफॉल्टिंग के लोड किया जा सकता है ।
मैं align_alloc में देख रहा हूं ।
यह मुझे एक सी-शैली सरणी दे सकता है जो सही ढंग से संरेखित है:
auto align_sz = static_cast<std::size_t> (32);
float* marr_a = (float*)aligned_alloc(align_sz, N*M*sizeof(float));
हालांकि मैं अनिश्चित हूं कि यह कैसे किया जाए std::vector<float>
। का std::vector<float>
स्वामित्व देना marr_a
संभव नहीं लगता है ।
मैंने कुछ सुझाव देखे हैं कि मुझे एक कस्टम एलोकेटर लिखना चाहिए , लेकिन यह बहुत काम की तरह लगता है, और शायद आधुनिक सी ++ के साथ एक बेहतर तरीका है?
_mm256_loadu_ps(&vec[i])
। (हालांकि ध्यान दें कि डिफ़ॉल्ट ट्यूनिंग विकल्पों के साथ जीसीसी विभाजन नहीं-गारंटी गठबंधन 256-बिट लोड / स्टोर vmovups XMM / vinsertf128 में। तो वहाँ है का उपयोग करने का लाभ_mm256_load
अधिकloadu
है, तो आप के बारे में परवाह कैसे जीसीसी पर अपने कोड compiles अगर कोई भूल उपयोग-mtune=...
या-march=
विकल्प।)