मेरी परियोजना में मैंने मूल श्रेणी सीवीक्टर लागू किया है। इस वर्ग में कच्चे फ़्लोटिंग पॉइंट सरणी के लिए फ्लोट * पॉइंटर शामिल है। यह सरणी मानक 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;
}
}
तो मेरा प्रश्न यह है कि कौन सा विकल्प बेहतर या तेज होगा?
अच्छा जवाब। मैं केवल "आपके कोड को प्रोफाइल" उत्तरों को खोजने की उम्मीद कर रहा था ... – Inverse
यह आधुनिक वास्तुकला पर अब महंगा नहीं है। – Quonux