এই প্রশ্নটি এখানে আমার প্রশ্নের উপর অব্যাহত রয়েছে (রহস্যের পরামর্শে):
আমার প্রশ্ন অব্যাহত রেখে, যখন আমি স্কেলারের নির্দেশাবলীর পরিবর্তে প্যাকড নির্দেশাবলী ব্যবহার করি তখন ইন্টার্নিক্স ব্যবহার করে কোডটি দেখতে খুব মিল দেখাবে:
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
লোড থেকে ভাসমান পয়েন্ট ডোমেনে অ্যাকাউন্টে স্যুইচিং ল্যাটেন্সিকে গ্রহণ করার জন্য সময়ের জন্য ব্যবহারের জন্য প্রস্তুত , তাই এটি কোনও অতিরিক্ত বিলম্বিত হওয়া উচিত নয় should
movaps
(প্রান্তিককৃত, যা বস্তাবন্দী পদক্ষেপ),addps
& mulps
তাই এই কোন অতিরিক্ত লেটেন্সি পারেন বহন করা উচিত নয় নির্দেশাবলী এই কার্নেল ব্যবহার করা হয় (সমাবেশ কোড সহ চেক করা), একই লেটেন্সি & তাদের স্কালে সংস্করণ হিসাবে থ্রুপুট আছে।
এই কার্নেলটি যে সর্বাধিক পারফরম্যান্স পেতে পারে তা চক্রের জন্য 6.4 এফপি অপারেশন এবং এটি চক্র প্রতি 5.6 এফপি অপারেটে চলছে, এমন ধারণা ধরে নিয়ে কারও কারও ধারণা আছে যে যেখানে 8 টি চক্রের অতিরিক্ত এই চক্রটি ব্যয় করা হয়েছে?
এখানে আসল সমাবেশটি দেখতে কেমন তা এখানে রয়েছে:
…
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 টি চক্র যুক্ত করে?" এটি একটি শক্ত ...