मेरा ऑर्गेनिक विचार एक सुरुचिपूर्ण कोड उदाहरण देना था, जो निर्देश कैश सीमाओं के प्रभाव का प्रदर्शन करेगा। मैंने कोड का निम्नलिखित भाग लिखा है, जो टेम्पलेट मेटाप्रोग्रामिंग का उपयोग करके, समान कार्यों की एक बड़ी मात्रा बनाता है।निर्देश कैश सीमाओं के प्रभाव का प्रदर्शन कैसे करें
volatile int checksum;
void (*funcs[MAX_FUNCS])(void);
template <unsigned t>
__attribute__ ((noinline)) static void work(void) { ++checksum; }
template <unsigned t>
static void create(void) { funcs[t - 1] = &work<t - 1>; create<t - 1>(); }
template <> void create<0>(void) { }
int main()
{
create<MAX_FUNCS>();
for (unsigned range = 1; range <= MAX_FUNCS; range *= 2)
{
checksum = 0;
for (unsigned i = 0; i < WORKLOAD; ++i)
{
funcs[i % range]();
}
}
return 0;
}
बाहरी पाश एक कूद तालिका का उपयोग करके विभिन्न कार्यों की मात्रा को बदलता है। प्रत्येक लूप पास के लिए, WORKLOAD
फ़ंक्शन का आह्वान करने के लिए लिया गया समय तब मापा जाता है। अब परिणाम क्या हैं? निम्नलिखित चार्ट उपयोग की गई सीमा के संबंध में प्रति कार्य कॉल औसत रन टाइम दिखाता है। नीली रेखा कोर i7 मशीन पर मापा गया डेटा दिखाती है। रेड लाइन द्वारा चित्रित तुलनात्मक माप, पेंटियम 4 मशीन पर किया गया था। फिर भी जब यह इन पंक्तियों की व्याख्या करने के लिए आता है, मैं किसी भी तरह संघर्ष किए जाने की ...
piecewise निरंतर लाल वक्र का केवल छलांग वास्तव में होते हैं जहां सीमा के भीतर सभी कार्यों के लिए कुल स्मृति की खपत से अधिक लग रहे हैं परीक्षण मशीन पर एक कैश स्तर की क्षमता, जिसमें कोई समर्पित निर्देश कैश नहीं है। बहुत छोटी श्रेणियों के लिए (इस मामले में 4 से नीचे) हालांकि, रन टाइम अभी भी कार्यों की मात्रा के साथ बढ़ता है। यह शाखा भविष्यवाणी दक्षता से संबंधित हो सकता है, लेकिन चूंकि प्रत्येक फंक्शन कॉल इस मामले में बिना शर्त कूद को कम कर देता है, इसलिए मुझे यकीन नहीं है कि क्या कोई शाखा दंड होना चाहिए।
नीला वक्र काफी अलग व्यवहार करता है। रन रेंज छोटी श्रेणियों के लिए स्थिर है और उसके बाद लॉगरिदमिक बढ़ जाती है। फिर भी बड़ी श्रृंखलाओं के लिए, वक्र एक निरंतर एसिम्पटोट फिर से आ रहा है। दोनों घटता के गुणात्मक अंतर कैसे समझाया जा सकता है?
मैं वर्तमान में g++ -std=c++11 -ftemplate-depth=65536
के साथ जीसीसी मिनीजीडब्ल्यू Win32 x86 v.4.8.1 का उपयोग कर रहा हूं और कोई संकलक अनुकूलन नहीं कर रहा हूं।
किसी भी मदद की सराहना की जाएगी। मुझे प्रयोग में सुधार करने के तरीके के बारे में किसी भी विचार में दिलचस्पी है। अग्रिम में धन्यवाद!