इस आलेख से शुरू - Gallery of Processor Cache Effects इगोर ओस्ट्रोवस्की द्वारा - मैं अपनी मशीनों पर अपने उदाहरणों के साथ खेलना चाहता था। यह पहला उदाहरण के लिए मेरी कोड, कि कैसे छू अलग कैश लाइनों पर लग रहा है चलने पर प्रभाव समय आ गया है:कैश लाइन आकार मापने के लिए सरल परीक्षण
:#include <iostream>
#include <time.h>
using namespace std;
int main(int argc, char* argv[])
{
int step = 1;
const int length = 64 * 1024 * 1024;
int* arr = new int[length];
timespec t0, t1;
clock_gettime(CLOCK_REALTIME, &t0);
for (int i = 0; i < length; i += step)
arr[i] *= 3;
clock_gettime(CLOCK_REALTIME, &t1);
long int duration = (t1.tv_nsec - t0.tv_nsec);
if (duration < 0)
duration = 1000000000 + duration;
cout<< step << ", " << duration/1000 << endl;
return 0;
}
कदम के लिए विभिन्न मूल्यों का उपयोग करना, मैं चल रहा समय में कूद नहीं दिख रहा है
step, microseconds
1, 451725
2, 334981
3, 287679
4, 261813
5, 254265
6, 246077
16, 215035
32, 207410
64, 202526
128, 197089
256, 195154
मैं के साथ कुछ ऐसा ही देखने की उम्मीद करेंगे:
लेकिन 16 के बाद से, चलने का समय हर बार जब हम दोगुना कदम को आधा कर दिया गया है से।
मैं इसे उबंटू 13, ज़ीऑन एक्स 5450 पर परीक्षण करता हूं और इसे संकलित करता हूं: g ++ -O0। क्या मेरे कोड के साथ कुछ गड़बड़ है, या परिणाम वास्तव में ठीक हैं? जो मुझे याद आ रही है उस पर कोई अंतर्दृष्टि अत्यधिक सराहना की जाएगी।
'-O0' के साथ प्रदर्शन मापने का समय बर्बाद है। ऐसा मत करो '-O2' या यहां तक कि '-march = native', esp' आज़माएं। यदि स्नातक के साथ खेलना है। – erenon
@erenon - theO0 की आवश्यकता है इसलिए सरणी असाइनमेंट को अनुकूलित नहीं किया गया है। परिणाम का उपयोग नहीं किया जाता है, इसलिए गणना हटा दी जा सकती है। –
@ क्रेग्स एंड एंडरसन: ऑप्टिमाइज़ेशन के बिना प्रदर्शन को मापने का कोई कारण नहीं है। परिणाम का प्रयोग करें - यह आसान है। – erenon