गठबंधन करने के लिए मिलता है यहाँ कोड मैं सामान्य रूप से उपयोग दृश्य स्टूडियो के साथ स्मृति गठबंधन करने के लिए जाता है और जीसीसीसबसे अच्छा पार मंच विधि स्मृति
inline void* aligned_malloc(size_t size, size_t align) {
void *result;
#ifdef _MSC_VER
result = _aligned_malloc(size, align);
#else
if(posix_memalign(&result, align, size)) result = 0;
#endif
return result;
}
inline void aligned_free(void *ptr) {
#ifdef _MSC_VER
_aligned_free(ptr);
#else
free(ptr);
#endif
}
सामान्य रूप में इस कोड को ठीक है? मैंने लोगों को _mm_malloc
, _mm_free
का उपयोग भी देखा है। ज्यादातर मामलों में मैं गठबंधन स्मृति चाहता हूं, यह एसएसई/एवीएक्स का उपयोग करना है। क्या मैं सामान्य रूप से उन कार्यों का उपयोग कर सकता हूं? यह मेरे कोड को बहुत आसान बना देगा।
आखिरकार, स्मृति को संरेखित करने के लिए अपना स्वयं का फ़ंक्शन बनाना आसान है (नीचे देखें)। फिर गठबंधन स्मृति प्राप्त करने के लिए इतने सारे अलग-अलग सामान्य कार्य क्यों हैं (जिनमें से कई केवल एक मंच पर काम करते हैं)?
यह कोड 16 बाइट संरेखण करता है।
float* array = (float*)malloc(SIZE*sizeof(float)+15);
// find the aligned position
// and use this pointer to read or write data into array
float* alignedArray = (float*)(((unsigned long)array + 15) & (~0x0F));
// dellocate memory original "array", NOT alignedArray
free(array);
array = alignedArray = 0;
देखें: http://www.songho.ca/misc/alignment/dataalign.html और How to allocate aligned memory only using the standard library?
संपादित करें: मामले में किसी को भी परवाह करता है, मैं Eigen से मेरी aligned_malloc() फ़ंक्शन के लिए विचार आया (Eigen/src/कोर/util/Memory.h)
संपादित करें: मुझे पता चला कि posix_memalign
MinGW के लिए अपरिभाषित है। हालांकि, _mm_malloc
विजुअल स्टूडियो 2012, जीसीसी, मिनजीडब्ल्यू, और इंटेल सी ++ कंपाइलर के लिए काम करता है, इसलिए यह सामान्य रूप से सबसे सुविधाजनक समाधान प्रतीत होता है। इसके लिए अपने _mm_free
फ़ंक्शन का उपयोग करने की भी आवश्यकता है, हालांकि कुछ कार्यान्वयन पर आप _mm_malloc
से मानक free
/delete
पर पॉइंटर्स पास कर सकते हैं।
जबकि पते की 'हस्ताक्षरित लंबी' कास्ट अभ्यास में काम कर सकती है, यह आईएलपी 32/एलपी 64/एलएलपी 64 (win64) डेटा मॉडल के बीच पोर्टेबल नहीं हो सकता है। –