2013-11-01 8 views
6

पर एमकेएल प्रदर्शन मेरे पास एक नियमित है जो मॉडल को फिट करने के लिए छोटे मैट्रिस (50-100 x 1000 तत्व) पर कुछ एमकेएल कॉल करता है, जिसे मैं अलग-अलग मॉडल के लिए कॉल करता हूं। छद्म कोड में:इंटेल फाई

int main(int argc, char **argv) { 
    ... 
    int numthreads=omp_max_num_threads(); 
    int c; 
#pragma omp parallel for private(c) 
    for(int t=0; t<numthreads; t++) { 
    // assuming nmodel divisible by numthreads...  
    c_start = t*nmodel/numthreads+1; 
    c_end = (t+1)*nmodel/numthreads; 
    for(c=c_start; c<c_stop; c++) { 
     ... 
     result = doModelFit(c, ...); 
     ... 
    } 
    } 
} 

जब:

double doModelFit(int model, ...) { 
    ... 
    while(!done) { 
    cblas_dgemm(...); 
    cblas_dgemm(...); 
    ... 
    dgesv(...); 
    ... 
    } 
    return result; 
} 

int main(int argc, char **argv) { 
    ... 
    c_start = 1; c_stop = nmodel; 
    for(int c=c_start; c<c_stop; c++) { 
    ... 
    result = doModelFit(c, ...); 
    ... 
    } 
} 

कॉल ऊपर संस्करण 1. चूंकि मॉडल स्वतंत्र हैं, मैं फिटिंग मॉडल parallelize करने, के रूप में (संस्करण 2) इस प्रकार OpenMP धागे का उपयोग कर सकते मैं मेजबान मशीन पर संस्करण 1 चलाता हूं, इसमें ~ 11 सेकंड लगते हैं और VTune खराब समांतरता की रिपोर्ट करता है जिसमें ज्यादातर समय निष्क्रिय रहता है। मेजबान मशीन पर संस्करण 2 ~ 5 सेकंड लेता है और वीट्यून महान समांतरता की रिपोर्ट करता है (लगभग 100% समय के उपयोग में 8 सीपीयू के साथ खर्च किया जाता है)। अब, जब मैं मूल मोड (फीम कार्ड) में फाई कार्ड पर चलाने के लिए कोड संकलित करता हूं, तो संस्करण 1 और 2 दोनों को mic0 पर कमांड प्रॉम्प्ट पर चलाने के दौरान लगभग 30 सेकंड लगते हैं। जब मैं vtune का उपयोग यह प्रोफ़ाइल:

  • संस्करण 1 एक ही लगभग 30 सेकंड लेता है, और हॉटस्पॉट विश्लेषण से पता चलता है कि ज्यादातर समय __kmp_wait_sleep और __kmp_static_yield में खर्च किया जाता है। 7710 के सीपीयू समय में, स्पिन टाइम में 5804 खर्च किए जाते हैं।
  • संस्करण 2 fooooorrrreevvvver लेता है ... मैं VTune में कुछ मिनट चलाने के बाद इसे मारता हूं। हॉटस्पॉट विश्लेषण से पता चलता है कि CPU समय के 25254s में, 21585s [vmlinux] में बिताए जाते हैं।

क्या कोई यहां क्या हो रहा है पर कुछ प्रकाश डाल सकता है और मुझे इतना बुरा प्रदर्शन क्यों मिल रहा है? मैं OMP_NUM_THREADS के लिए डिफ़ॉल्ट का उपयोग कर रहा हूं और KMP_AFFINITY = कॉम्पैक्ट, ग्रैन्युलरिटी = ठीक (इंटेल द्वारा अनुशंसित) सेट करें। मैं एमकेएल और ओपनएमपी के लिए नया हूं, इसलिए मुझे यकीन है कि मैं रूकी गलतियों को कर रहा हूं।

धन्यवाद, एंड्रयू

+1

एमकेएल में फी पर छोटे मैट्रिस के साथ कुछ गंभीर प्रदर्शन समस्याएं हैं। मैं इंटेल फ़ोरम पर अपना प्रश्न पोस्ट करने की अनुशंसा करता हूं: http://software.intel.com/en-us/forums/intel-many-integrated-core – pburka

+1

@pburka मैंने वहां भी पोस्ट किया है। बस एक व्यापक नेट डालने की कोशिश कर रहा है। :) क्या आपके पास छोटी मैट्रिक्स समस्याओं के लिए एक लिंक है? – Andrew

+1

यहां एक समस्या है http://software.intel.com/en-us/forums/topic/475924। मैं इंटेल के साथ प्रीमियर सपोर्ट के माध्यम से भी अनुसरण कर रहा हूं। इस मामले में मेरा मानना ​​है कि एमकेएल धागे की संख्या को 30 तक कम कर देता है, और उसके बाद जीईएमएम कॉल के बाद धागे को स्पिन करने में 1ms लगते हैं। लेकिन मुझे यह भी विश्वास है कि यह एकमात्र जीईएमएम प्रदर्शन समस्या नहीं है। – pburka

उत्तर

1

इस व्यवहार, यह देखते हुए कि ज्यादातर समय ओएस (vmlinux) में खर्च किया जाता है के लिए सबसे संभावित कारण यह है ओवर-सब्सक्रिप्शन cblas_dgemm() और dgesv की MKL कार्यान्वयन के अंदर नेस्टेड OpenMP समानांतर क्षेत्र की वजह से । जैसे this example देखें।

यह संस्करण जिम डेम्पसी द्वारा Intel forum पर समर्थित और समझाया गया है।

0

एमकेएल का उपयोग करने के बारे में क्या: अनुक्रमिक पुस्तकालय? यदि आप अनुक्रमिक विकल्प के साथ एमकेएल लाइब्रेरी को लिंक करते हैं, तो यह एमकेएल के अंदर ओपनएमपी धागे उत्पन्न नहीं करता है। मुझे लगता है कि आप अब से बेहतर परिणाम प्राप्त कर सकते हैं।

+0

यह प्रश्न का उत्तर नहीं देता है। किसी लेखक से स्पष्टीकरण की आलोचना करने या अनुरोध करने के लिए, अपनी पोस्ट के नीचे एक टिप्पणी छोड़ दें - आप हमेशा अपनी पोस्ट पर टिप्पणी कर सकते हैं, और एक बार आपके पास पर्याप्त [प्रतिष्ठा] (http://stackoverflow.com/help/whats-reputation) हो [किसी भी पोस्ट पर टिप्पणी करने में सक्षम] [http://stackoverflow.com/help/privileges/comment)। – durron597

+0

आम तौर पर, किसी टूल या लाइब्रेरी के लिंक या संदर्भों में केवल एक विशिष्ट स्पष्टीकरण शामिल नहीं होना चाहिए कि समस्या के लिए अनुशंसित संसाधन कैसे लागू होता है, लेकिन [उपयोग नोट्स या कुछ नमूना कोड के साथ भी] [http: //meta.stackoverflow .com/एक/251,605)। (@ durron597: तकनीकी रूप से, यह * एक उत्तर है, बस इतना ही आश्चर्यजनक नहीं है।) –

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