ෆෝට්රාන් (විද්යාත්මක පරිගණනය සඳහා නිර්මාණය කර ඇති) සතුව බල සැපයුම්කරුවෙකු සිටින අතර, මා දන්නා පරිදි ෆෝට්රාන් සම්පාදකයින් සාමාන්යයෙන් ඔබ විස්තර කරන දෙයට සමාන ආකාරයකින් පූර්ණ සංඛ්යා දක්වා ඉහළ නැංවීම ප්රශස්ත කරනු ඇත. C / C ++ අවාසනාවකට බල ක්රියාකරුවෙකු නොමැත, පුස්තකාල ක්රියාකාරිත්වය පමණි pow()
. මෙය ස්මාර්ට් සම්පාදකයින්ට විශේෂ ලෙස සැලකීම pow
හා විශේෂ අවස්ථා සඳහා වේගවත් ආකාරයකින් ගණනය කිරීම වළක්වන්නේ නැත , නමුත් ඔවුන් එය අඩුවෙන් කරන බව පෙනේ ...
මීට වසර කිහිපයකට පෙර මම පූර්ණ සංඛ්යා ප්රශස්ත ආකාරයකින් ගණනය කිරීම වඩාත් පහසු කිරීමට උත්සාහ කළ අතර පහත සඳහන් කරුණු ඉදිරිපත් කළෙමි. එය C ++ මිස C නොවේ, නමුත් තවමත් රඳා පවතින්නේ සම්පාදකයා යම් යම් දේ ප්රශස්තිකරණය කරන්නේ කෙසේද යන්න පිළිබඳව තරමක් බුද්ධිමත් වීම මත ය. කෙසේ වෙතත්, එය ප්රායෝගිකව ඔබට ප්රයෝජනවත් වේ යැයි සිතමු:
template<unsigned N> struct power_impl;
template<unsigned N> struct power_impl {
template<typename T>
static T calc(const T &x) {
if (N%2 == 0)
return power_impl<N/2>::calc(x*x);
else if (N%3 == 0)
return power_impl<N/3>::calc(x*x*x);
return power_impl<N-1>::calc(x)*x;
}
};
template<> struct power_impl<0> {
template<typename T>
static T calc(const T &) { return 1; }
};
template<unsigned N, typename T>
inline T power(const T &x) {
return power_impl<N>::calc(x);
}
කුතුහලය දනවන අය සඳහා පැහැදිලි කිරීම: මෙය බලයන් ගණනය කිරීම සඳහා ප්රශස්ත ක්රමයක් සොයා නොගනී, නමුත් ප්රශස්ත විසඳුම සොයා ගැනීම එන්පී-සම්පුර්ණ ගැටළුවක් වන අතර මෙය කෙසේ හෝ කුඩා බලවතුන් සඳහා පමණක් කිරීම වටී (භාවිතා කිරීමට වඩා වෙනස්ව pow
), කලබල වීමට හේතුවක් නැත විස්තර සහිතව.
ඉන්පසු එය භාවිතා කරන්න power<6>(a)
.
මෙය බලතල ටයිප් කිරීම පහසු කරයි ( a
පරෙන්ස් සමඟ තත්පර 6 ක් අක්ෂර වින්යාසය කිරීමට අවශ්ය නැත ), සහ ඔබට වන්දි ගෙවන සාරාංශය-ffast-math
වැනි නිරවද්යතාව මත රඳා පවතින යමක් තිබේ නම් (මේ ආකාරයේ ප්රශස්තිකරණයක් ලබා ගැනීමට ඔබට ඉඩ සලසයි) (මෙහෙයුම් අනුපිළිවෙල අත්යවශ්ය වන උදාහරණයක්) .
මෙය C ++ බව ඔබට බොහෝ විට අමතක කළ හැකි අතර එය C වැඩසටහනේ භාවිතා කරන්න (එය C ++ සම්පාදකයෙකු සමඟ සම්පාදනය කරන්නේ නම්).
මෙය ප්රයෝජනවත් වේ යැයි සිතමි.
සංස්කරණය කරන්න:
මගේ සම්පාදකයාගෙන් මට ලැබෙන්නේ මෙයයි:
සඳහා a*a*a*a*a*a
,
movapd %xmm1, %xmm0
mulsd %xmm1, %xmm0
mulsd %xmm1, %xmm0
mulsd %xmm1, %xmm0
mulsd %xmm1, %xmm0
mulsd %xmm1, %xmm0
සඳහා (a*a*a)*(a*a*a)
,
movapd %xmm1, %xmm0
mulsd %xmm1, %xmm0
mulsd %xmm1, %xmm0
mulsd %xmm0, %xmm0
සඳහා power<6>(a)
,
mulsd %xmm0, %xmm0
movapd %xmm0, %xmm1
mulsd %xmm0, %xmm1
mulsd %xmm0, %xmm1