2013-02-20 12 views
7

प्रोग्रामिंग के प्रदर्शन और प्रदर्शन ट्यूनिंग पर काम करने वाले लोगों के लिए एक सामान्य प्रश्न के रूप में, आप कैसे पता लगाते हैं कि आपका कोड सीपीयू बाध्य है या मेमोरी बाध्य है? मैं सामान्य रूप से इन अवधारणाओं को समझता हूं, लेकिन यदि मैंने कहा है, 'वाई' भार और भंडार और '2y' गणनाओं की मात्रा, बाधा क्या है, यह जानने के लिए कोई कैसे जाता है?समझें कि कोड नमूना सीपीयू बाध्य है या मेमोरी बाध्य

क्या आप यह भी पता लगा सकते हैं कि आप वास्तव में अपना अधिकांश समय कहां खर्च कर रहे हैं और कहें, यदि आप प्रत्येक लूप पुनरावृत्ति में कैश (यदि इसकी स्मृति बाध्य) में डेटा की 'x' मात्रा लोड करते हैं, तो आपका कोड तेज़ी से चलाएगा ? क्या परीक्षण और त्रुटि के अलावा, 'x' निर्धारित करने का कोई सटीक तरीका है?

क्या कोई उपकरण है जिसका उपयोग आप करेंगे IA-32 या IA-64 आर्किटेक्चर पर कहें? Doest VTune मदद करते हैं?

उदाहरण के लिए, मैं वर्तमान में कर रहा हूँ निम्नलिखित:

मैं जटिल युगल के 26 8 * 8 मैट्रिक्स है और मैं के साथ एक MVM (मैट्रिक्स वेक्टर गुणा) (~ 4000) लंबाई 8 की वैक्टर प्रदर्शन करने के लिए है , इन 26 मैट्रिक्स में से प्रत्येक के लिए। मैं जटिल गुणा करने के लिए एसएसई का उपयोग करता हूं।

/*Copy 26 matrices to temporary storage*/ 
for(int i=0;i<4000;i+=2){//Loop over the 4000 vectors 
    for(int k=0;k<26;k++){//Loop over the 26 matrices 
     /* 
     Perform MVM in blocks of '2' between kth matrix and 
     'i' and 'i+1' vector 
     */  

    } 
} 

26 मैट्रिक्स 26kb ले (एल 1 कैश 32 केबी है) और मैं स्मृति में बाहर वैक्टर रखा है ऐसा है कि मैं stride'1 है 'तक पहुँचता है। एक बार जब मैं 27 मैट्रिक्स के साथ वेक्टर पर एमवीएम करता हूं, तो मैं उनसे फिर से नहीं जाता, इसलिए मुझे नहीं लगता कि कैश अवरोधन मदद करेगा। मैंने वेक्टरेशन का उपयोग किया है लेकिन मैं अभी भी शीर्ष प्रदर्शन के 60% पर अटक गया हूं।

मैंने बाहरी लूप के हर पुनरावृत्ति के लिए अस्थायी भंडारण में 64 वैक्टरों की प्रतिलिपि बनाने की कोशिश की, यह सोचने की कोशिश की कि वे कैश और सहायता में होंगे, लेकिन इसका केवल कम प्रदर्शन होगा। मैंने निम्नलिखित तरीके से _mm_prefetch() का उपयोग करने की कोशिश की: जब मैं लगभग आधा मैट्रिस के साथ किया जाता हूं, तो मैं अगली 'i' और 'i + 1' वेक्टर को स्मृति में लोड करता हूं, लेकिन इससे भी मदद नहीं मिली है।

मैंने यह सब अपनी याददाश्त को संभालने के लिए किया है लेकिन मैं निश्चित रूप से जानना चाहता हूं। क्या उधर रास्ता है?

+0

आप किस ओएस का उपयोग कर रहे हैं? – amdn

+0

लिनक्स। लेकिन ओएस इस मामले में कैसे मायने रखता है? मैं इसे जॉब शेड्यूलिंग का उपयोग करके क्लस्टर पर चला रहा हूं, इसलिए कोई अन्य प्रक्रिया चल रही नहीं है .. – user1715122

+0

मैं उत्सुक हूं, क्या आपने 'perf' का उपयोग करने का प्रयास किया है? – amdn

उत्तर

1

मेरी समझ के लिए सबसे अच्छा तरीका आपके आवेदन/वर्कलोड को प्रोफाइल करना है। इनपुट डेटा के आधार पर, एप्लिकेशन/वर्कलोड की विशेषता काफी भिन्न हो सकती है। हालांकि इन व्यवहारों को कुछ phases रेफ [2, 3] के साथ मात्राबद्ध किया जा सकता है और एक हिस्टोग्राम व्यापक रूप से वर्कलोड के सबसे लगातार पथ को अनुकूलित करने के लिए बता सकता है। जो प्रश्न आप पूछ रहे हैं उसे एक आर्किटेक्चर के लिए बेंचमार्क प्रोग्राम [जैसे SPEC2006, PARSEC, मीडिया बेंच इत्यादि] की आवश्यकता होगी और सामान्य शर्तों में जवाब देना मुश्किल है (और कंप्यूटर आर्किटेक्चर में अनुसंधान का एक सक्रिय हिस्सा है)। हालांकि, विशिष्ट मामलों के लिए विभिन्न मेमोरी पदानुक्रमों के लिए मात्रात्मक परिणाम कहा जा सकता है।

  • Perf
  • OProfile
  • vtune
  • LikWid
  • LLTng

और अन्य निगरानी और सिमुलेशन उपकरण आवेदन की रूपरेखा निशान पाने के लिए: आप जैसे टूल का उपयोग कर सकते हैं। आप मेमोरी बाध्यता निर्धारित करने के लिए आईपीसी, सीपीआई (सीपीयू बाउंड के लिए) और मेमोरी एक्सेस, कैश मिस, कैश एक्सेस और अन्य मेमोरी काउंटर जैसे प्रदर्शन काउंटर देख सकते हैं। आईपीसी के समान, मेमोरी एक्सेस प्रति चक्र (एमपीसी), अक्सर निर्धारित करने के लिए प्रयोग किया जाता है एक आवेदन/वर्कलोड की स्मृति सीमा। विशेष रूप से मैट्रिक्स गुणा सुधारने के लिए, मैं LAPACK में अनुकूलित एल्गोरिदम का उपयोग करने का सुझाव दूंगा।

संबंधित मुद्दे