मेरे पास निम्नलिखित C++ कोड स्निपेट है (सी ++ भाग प्रोफाइलर क्लास है जो यहां छोड़ा गया है), वीएस -2010 (64 बिट इंटेल मशीन) के साथ संकलित। कोड बस एक अदिश के साथ तैरता (arr2
) की एक सरणी गुणा करता है, और एक अन्य सरणी (arr1
) में परिणाम कहते हैं:प्रदर्शन अंतर्निहित डेटा मानों पर निर्भर करता है
int M = 150, N = 150;
int niter = 20000; // do many iterations to have a significant run-time
float *arr1 = (float *)calloc (M*N, sizeof(float));
float *arr2 = (float *)calloc (M*N, sizeof(float));
// Read data from file into arr2
float scale = float(6.6e-14);
// START_PROFILING
for (int iter = 0; iter < niter; ++iter) {
for (int n = 0; n < M*N; ++n) {
arr1[n] += scale * arr2[n];
}
}
// END_PROFILING
free(arr1);
free(arr2);
पढ़ने-से-फ़ाइल हिस्सा है और रूपरेखा (यानी रन-टाइम माप) है सादगी के लिए यहां छोड़ा गया।
जब arr2
रेंज में यादृच्छिक संख्या को आरंभ नहीं हो जाता [0 1], कोड तेजी के रूप में एक मामले में जहां arr2
एक विरल सरणी जिसमें मूल्यों के बारे में 2/3 शून्य कर रहे हैं करने के लिए आरंभ नहीं हो जाता की तुलना के बारे में 10 बार चलाता है । मैंने कंपाइलर विकल्प /fp
और /O
के साथ खेला है, जिसने रन-टाइम को थोड़ा सा बदल दिया है, लेकिन 1:10 का अनुपात लगभग रखा गया था।
- प्रदर्शन वास्तविक मूल्यों पर निर्भर कैसे होता है? सीपीयू अलग-अलग करता है जो स्पैस डेटा को ~ 10 गुना धीमा कर देता है?
- क्या "धीमी डेटा" तेजी से चलाने के लिए कोई तरीका है, या कोई ऑप्टिमाइज़ेशन (उदाहरण के लिए गणना को सदिश बनाना) दोनों सरणी पर समान प्रभाव डालता है (यानी, "धीमी डेटा" अभी भी धीमी गति से चलती है तो "तेज़ डेटा")?
संपादित
पूरा कोड यहाँ है: https://gist.github.com/1676742, संकलन के लिए कमांड लाइन test.cpp
में एक टिप्पणी में है।
डेटा फ़ाइलों को यहां हैं:
कृपया आप दो परीक्षणों के पूर्ण, संकलित संस्करण प्रदान कर सकते हैं, ताकि हम उनके साथ प्रयोग कर सकें? – NPE
क्या यह हो सकता है कि जब आप अपने स्पैर मैट्रिक्स में अपनी फ्लोट पर '0' पास करते हैं, तो 'int' से' float' में रूपांतरण कुछ ओवरहेड पेश करता है? –
क्या आप केवल उन तत्वों को अपडेट करते हैं जो 0 नहीं हैं? तो, क्या यह हो सकता है कि शून्य कैश में नहीं हैं? – duedl0r