का उपयोग कर 4 डॉट उत्पादों को सी में एक संगत सरणी में स्टोर करने का सबसे प्रभावी तरीका एसएसई इंट्रिनिक्स का उपयोग करके इंटेल x86 नेहलेम माइक्रो-आर्किटेक्चर के लिए कुछ कोड अनुकूलित कर रहा हूं।एसएसई इंट्रिनिक्स
मेरे प्रोग्राम का एक हिस्सा 4 डॉट उत्पादों की गणना करता है और प्रत्येक परिणाम को प्रत्येक मान को सरणी के एक संगत खंड में जोड़ता है। विशेष रूप से,
tmp0 = _mm_dp_ps(A_0m, B_0m, 0xF1);
tmp1 = _mm_dp_ps(A_1m, B_0m, 0xF2);
tmp2 = _mm_dp_ps(A_2m, B_0m, 0xF4);
tmp3 = _mm_dp_ps(A_3m, B_0m, 0xF8);
tmp0 = _mm_add_ps(tmp0, tmp1);
tmp0 = _mm_add_ps(tmp0, tmp2);
tmp0 = _mm_add_ps(tmp0, tmp3);
tmp0 = _mm_add_ps(tmp0, C_0n);
_mm_storeu_ps(C_2, tmp0);
सूचना है कि मैं 4 अस्थायी XMM का उपयोग करके इस बारे में जा रहा हूँ प्रत्येक डॉट उत्पाद का परिणाम धारण करने के लिए पंजीकृत करता है।
tmp0 = R0-शून्य-शून्य-शून्य
tmp1 = शून्य: प्रत्येक XMM रजिस्टर में, परिणाम रिश्तेदार अन्य अस्थायी XMM रजिस्टरों ऐसी है कि अंतिम परिणाम इस तरह दिखता है के लिए एक अनूठा 32 बिट में रखा जाता है -R1-शून्य-शून्य
tmp2 = शून्य-शून्य-R2-शून्य
tmp3 = शून्य-शून्य-शून्य-R3
मैं के बाद एक XMM चर में मान प्रत्येक tmp चर में निहित गठबंधन निम्नलिखित निर्देशों के साथ उन्हें संक्षेप में:
tmp0 = _mm_add_ps(tmp0, tmp1);
tmp0 = _mm_add_ps(tmp0, tmp2);
tmp0 = _mm_add_ps(tmp0, tmp3);
अंत में, मैं एक सरणी का एक सन्निहित भाग को डॉट उत्पादों के सभी 4 परिणाम युक्त ताकि सरणी के अनुक्रमित तो की तरह, एक डॉट उत्पाद से बढ़ती है, रजिस्टर जोड़ने (C_0n 4 मूल्यों में हैं सरणी जिसे अद्यतन किया जाना है;
tmp0 = _mm_add_ps(tmp0, C_0n);
_mm_storeu_ps(C_2, tmp0);
मैं अगर वहाँ डॉट उत्पादों के परिणामों लेने के लिए और उनमें से सटे हिस्सा में जोड़ने के लिए एक कम राउंड के बारे में, अधिक कुशलता से जानना चाहता हूँ: C_2) पता इनमें से 4 मूल्यों की ओर इशारा करते है सरणी इस तरह, मैं रजिस्टरों के बीच 3 जोड़ कर रहा हूं जिनमें केवल 1 गैर-शून्य मान है। ऐसा लगता है कि इसके बारे में जाने का एक और अधिक प्रभावी तरीका होना चाहिए।
मैं सभी मदद की सराहना करता हूं। धन्यवाद।
आपको स्टोर से पहले प्रत्येक डॉट उत्पाद में पुराना मान (C_0n) जोड़ना होगा। वे सभी स्वतंत्र होंगे, इसलिए यह बहुत धीमी नहीं हो सकती है, लेकिन यह बहुत सुंदर नहीं है :) – celion