2011-02-25 8 views
8

मेरी परियोजना में मैंने मूल श्रेणी सीवीक्टर लागू किया है। इस वर्ग में कच्चे फ़्लोटिंग पॉइंट सरणी के लिए फ्लोट * पॉइंटर शामिल है। यह सरणी मानक malloc() फ़ंक्शन का उपयोग करके गतिशील रूप से आवंटित की जाती है।गणना को तेज करने के लिए एसएसई का उपयोग करना - स्टोर, लोड और संरेखण

अब मुझे ऐसे वैक्टरों का उपयोग करके कुछ गणना करना है। दुर्भाग्य से _mm_malloc() का उपयोग करके स्मृति को आवंटित नहीं किया गया है, यह गठबंधन नहीं है।

मैं समझता हूँ जैसा कि मैंने दो विकल्प हैं:

1) पुनर्लेखन कोड जो) _mm_malloc (उपयोग करने के लिए और उदाहरण के लिए इस तरह कोड का उपयोग स्मृति आवंटित करता है:

void sub(float* v1, float* v2, float* v3, int size) 
{ 
    __m128* p_v1 = (__m128*)v1; 
    __m128* p_v2 = (__m128*)v2; 
    __m128 res; 

    for(int i = 0; i < size/4; ++i) 
    { 
     res = _mm_sub_ps(*p_v1,*p_v2); 
     _mm_store_ps(v3,res); 
     ++p_v1; 
     ++p_v2; 
     v3 += 4; 
    } 
} 

2) दूसरा विकल्प है unaligned स्मृति से __m128 लोड करने के लिए _mm_loadu_ps() निर्देश का उपयोग करने के लिए और फिर गणना के लिए इसका उपयोग करें।

void sub(float* v1, float* v2, float* v3, int size) 
{ 
    __m128 p_v1; 
    __m128 p_v2; 
    __m128 res; 

    for(int i = 0; i < size/4; ++i) 
    { 
     p_v1 = _mm_loadu_ps(v1); 
     p_v2 = _mm_loadu_ps(v2); 
     res = _mm_sub_ps(p_v1,p_v2);  
     _mm_store_ps(v3,res); 
     v1 += 4; 
     v2 += 4; 
     v3 += 4; 
    } 
} 

तो मेरा प्रश्न यह है कि कौन सा विकल्प बेहतर या तेज होगा?

उत्तर

15

असाइन किए गए एसएसई मूल्यों को पढ़ना असाधारण महंगा है। इंटेल मैनुअल, वॉल्यूम 4, अध्याय 2.2.5.1 देखें। मूल प्रकार एक फर्क पड़ता है, i7 में इसे कम महंगा बनाने के लिए अतिरिक्त हार्डवेयर है। लेकिन सीपीयू कैश लाइन सीमा को स्ट्रैड करने वाला मान पढ़ना एक गठबंधन मूल्य पढ़ने से 4.5 गुना धीमा है। यह दस पिछले आर्किटेक्चर पर धीमा है।

यह भारी है, उस perf हिट से बचने के लिए स्मृति गठबंधन प्राप्त करें। _mm_malloc के बारे में कभी नहीं सुना, ढेर से ठीक से गठबंधन स्मृति प्राप्त करने के लिए Microsoft CRT से _aligned_malloc() का उपयोग करें।

+6

अच्छा जवाब। मैं केवल "आपके कोड को प्रोफाइल" उत्तरों को खोजने की उम्मीद कर रहा था ... – Inverse

+0

यह आधुनिक वास्तुकला पर अब महंगा नहीं है। – Quonux

1

bullet physics पर एक नज़र डालें। इसका इस्तेमाल कुछ हद तक फिल्में और प्रसिद्ध गेम (जीटीए 4 और अन्य) के लिए किया गया है। आप या तो अपने सुपर अनुकूलित वेक्टर, मैट्रिक्स और अन्य गणित वर्गों पर एक नज़र डाल सकते हैं, या बस इसके बजाय उनका उपयोग कर सकते हैं। यह zlib लाइसेंस के तहत प्रकाशित है ताकि आप इसे अपनी इच्छानुसार उपयोग कर सकें। पहिया को पुन: पेश न करें। बुलेट, एनवीडिया फिजिक्स, हावोक और अन्य भौतिकी पुस्तकालयों का अच्छी तरह से परीक्षण किया गया है और वास्तव में स्मार्ट लोगों द्वारा अनुकूलित किया गया है

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