यह सवाल मेरे यहाँ (रहस्य की सलाह पर) जारी है:
अपने प्रश्न पर जारी रखते हुए, जब मैं स्केलर के बजाय पैक्ड निर्देशों का उपयोग करता हूं, तो आंतरिक निर्देशों का उपयोग करके कोड बहुत समान दिखाई देगा:
for(int i=0; i<size; i+=16) {
y1 = _mm_load_ps(output[i]);
…
y4 = _mm_load_ps(output[i+12]);
for(k=0; k<ksize; k++){
for(l=0; l<ksize; l++){
w = _mm_set_ps1(weight[i+k+l]);
x1 = _mm_load_ps(input[i+k+l]);
y1 = _mm_add_ps(y1,_mm_mul_ps(w,x1));
…
x4 = _mm_load_ps(input[i+k+l+12]);
y4 = _mm_add_ps(y4,_mm_mul_ps(w,x4));
}
}
_mm_store_ps(&output[i],y1);
…
_mm_store_ps(&output[i+12],y4);
}
इस कर्नेल का मापा प्रदर्शन लगभग 5.6 एफपी संचालन प्रति चक्र है, हालांकि मुझे उम्मीद है कि यह स्केलर संस्करण के प्रदर्शन के 4x के बराबर होगा, अर्थात प्रति चक्र 4.1,6 = 6,4 एफपी ऑप्स।
वजन कारक के कदम को ध्यान में रखते हुए (यह इंगित करने के लिए धन्यवाद), अनुसूची इस प्रकार है:
ऐसा लगता है कि शेड्यूल नहीं बदलता है, हालांकि movss
ऑपरेशन के बाद एक अतिरिक्त निर्देश है जो स्केलर के मान को एक्सएमएम रजिस्टर में ले जाता है और फिर shufps
पूरे वेक्टर में इस स्केलर मान को कॉपी करने के लिए उपयोग करता है। ऐसा लगता है कि वजन वेक्टर mulps
स्विचिंग विलंबता को लोड करने से लेकर फ्लोटिंग पॉइंट डोमेन तक खाते में समय पर उपयोग करने के लिए तैयार है , इसलिए यह किसी भी अतिरिक्त विलंबता को नहीं लेना चाहिए।
movaps
(गठबंधन, पैक चाल), addps
और mulps
इसलिए यह किसी भी अतिरिक्त विलंबता या तो नहीं उठाना चाहिए निर्देश है कि इस कर्नेल में उपयोग किया जाता है (विधानसभा कोड के साथ की जाँच), एक ही विलंबता और उनके अदिश संस्करणों के रूप में प्रवाह क्षमता है।
क्या किसी को इस बात का अंदाजा है कि यह 8 चक्र प्रति अतिरिक्त चक्र कहां खर्च किया जाता है, यह मानकर कि यह कर्नेल अधिकतम प्रदर्शन प्राप्त कर सकता है 6.4 एफपी ऑप्स प्रति चक्र है और यह 5.6 एफपी ऑप्स प्रति चक्र पर चल रहा है?
वैसे यहाँ वास्तविक सभा कैसी दिखती है:
…
Block x:
movapsx (%rax,%rcx,4), %xmm0
movapsx 0x10(%rax,%rcx,4), %xmm1
movapsx 0x20(%rax,%rcx,4), %xmm2
movapsx 0x30(%rax,%rcx,4), %xmm3
movssl (%rdx,%rcx,4), %xmm4
inc %rcx
shufps $0x0, %xmm4, %xmm4 {fill weight vector}
cmp $0x32, %rcx
mulps %xmm4, %xmm0
mulps %xmm4, %xmm1
mulps %xmm4, %xmm2
mulps %xmm3, %xmm4
addps %xmm0, %xmm5
addps %xmm1, %xmm6
addps %xmm2, %xmm7
addps %xmm4, %xmm8
jl 0x401ad6 <Block x>
…
shufps
अनुदेश हर 1.6 पुनरावृत्तियों में 1 चक्र क्यों जोड़ता है?" यह एक कठिन है ...