निम्न उदाहरण कोड आकार N
का एक मैट्रिक्स उत्पन्न करता है, और इसे SAMPLES
कई बार स्थानांतरित करता है। जब N = 512
पारदर्शिता संचालन का औसत निष्पादन समय 2144 μs
(coliru link) है। फर्स्ट लुक पर कुछ भी नहीं विशेष है, है ना? ...इन मैट्रिक्स ट्रांसपोजिशन समय इतने प्रति-सहज क्यों हैं?
ठीक है, यहाँ
N = 513
→1451 μs
N = 519
→600 μs
N = 530
→486 μs
N = 540
के लिए परिणाम हैं →492 μs
(आखिरकार! सिद्धांत काम करना शुरू कर देता है :)।
तो अभ्यास में ये सरल गणना सिद्धांत से अलग क्यों हैं? क्या यह व्यवहार सीपीयू कैश समेकन या कैश मिस से संबंधित है? यदि ऐसा है तो कृपया समझाओ।
#include <algorithm>
#include <iostream>
#include <chrono>
constexpr int N = 512; // Why is 512 specifically slower (as of 2016)
constexpr int SAMPLES = 1000;
using us = std::chrono::microseconds;
int A[N][N];
void transpose()
{
for (int i = 0 ; i < N ; i++)
for (int j = 0 ; j < i ; j++)
std::swap(A[i][j], A[j][i]);
}
int main()
{
// initialize matrix
for (int i = 0 ; i < N ; i++)
for (int j = 0 ; j < N ; j++)
A[i][j] = i+j;
auto t1 = std::chrono::system_clock::now();
for (int i = 0 ; i < SAMPLES ; i++)
transpose();
auto t2 = std::chrono::system_clock::now();
std::cout << "Average for size " << N << ": " << std::chrono::duration_cast<us>(t2 - t1).count()/SAMPLES << " (us)";
}
आपने स्निपेट कितनी बार चलाया? रनटाइम रन से चलने में काफी भिन्न हो सकते हैं, इस पर निर्भर करता है कि आपका सिस्टम कितनी अन्य चीजें कर सकता है। क्या ये लगभग 10 या 20 रनों का औसत समय है, या केवल एक रन से समय? – JGroven
शायद 512 एक जादू का आकार है जो कैश को बहुत ही फिट करता है ताकि आपको बहुत सारे कैश मिस मिल जाए। अन्य आकार बेहतर फिट होते हैं ताकि आपको कम याद आती है। – NathanOliver
गलत तरीके से @NathanOliver - 512 513 से बहुत धीमा * धीमा * –