पर एमकेएल प्रदर्शन मेरे पास एक नियमित है जो मॉडल को फिट करने के लिए छोटे मैट्रिस (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 = कॉम्पैक्ट, ग्रैन्युलरिटी = ठीक (इंटेल द्वारा अनुशंसित) सेट करें। मैं एमकेएल और ओपनएमपी के लिए नया हूं, इसलिए मुझे यकीन है कि मैं रूकी गलतियों को कर रहा हूं।
धन्यवाद, एंड्रयू
एमकेएल में फी पर छोटे मैट्रिस के साथ कुछ गंभीर प्रदर्शन समस्याएं हैं। मैं इंटेल फ़ोरम पर अपना प्रश्न पोस्ट करने की अनुशंसा करता हूं: http://software.intel.com/en-us/forums/intel-many-integrated-core – pburka
@pburka मैंने वहां भी पोस्ट किया है। बस एक व्यापक नेट डालने की कोशिश कर रहा है। :) क्या आपके पास छोटी मैट्रिक्स समस्याओं के लिए एक लिंक है? – Andrew
यहां एक समस्या है http://software.intel.com/en-us/forums/topic/475924। मैं इंटेल के साथ प्रीमियर सपोर्ट के माध्यम से भी अनुसरण कर रहा हूं। इस मामले में मेरा मानना है कि एमकेएल धागे की संख्या को 30 तक कम कर देता है, और उसके बाद जीईएमएम कॉल के बाद धागे को स्पिन करने में 1ms लगते हैं। लेकिन मुझे यह भी विश्वास है कि यह एकमात्र जीईएमएम प्रदर्शन समस्या नहीं है। – pburka