दिलचस्प पोस्ट
C # int, Int32 और enums क्रॉस-ऑप संसाधन साझाकरण (सीओआरएस) को एनोड.जेएस पर एक्सप्रेस.जेएस ढांचे में कैसे सक्षम करें URL क्वेरी स्ट्रिंग प्राप्त करें <P: संवाद> के गाया और दृश्यमान विशेषताओं के बीच का अंतर जावास्क्रिप्ट काट / टुकड़ा / स्ट्रिंग में अंतिम वर्ण को छानना IIS6 को जेएसओएन फाइलों (इंक पोस्ट, जीईटी) की सेवा प्रदान करें? फ़ोन नंबर को तेजी से कॉल करना स्केल फ़ंक्शन 22 पैरामीटर तक सीमित क्यों हैं? github: कोई समर्थित प्रमाणन विधियाँ उपलब्ध नहीं हैं मैं किसी वेबब्राउजर से एक पॉपअप को दूसरी विंडो में कैसे प्रदर्शित कर सकता हूं? त्रुटि: अनुरोध हैडर फ़ील्ड सामग्री-प्रकार का उपयोग-नियंत्रण-अनुमति-हेडर द्वारा अनुमति नहीं है आईएसओ में NSURL कनेक्शन और मूल HTTP प्रमाणीकरण क्या सीएमएडी में अनिर्दिष्ट किसी यूनियन के माध्यम से प्रकार-छेड़छाड़ की जाती है, और क्या यह सी 11 में निर्दिष्ट हो गया है? MySQL: कई तालिकाओं या कई डेटाबेस? कोई सभ्य सी # profilers वहाँ बाहर?

एक ओपनएमपी समानांतर कोड में, समानांतर में चलाने के लिए मैमसेट का कोई फायदा होगा?

मेरे पास स्मृति के ब्लॉक हैं जो काफी बड़ा हो सकते हैं (एल 2 कैश से बड़ा), और कभी-कभी मुझे उन्हें सभी शून्य पर सेट करना चाहिए मेमसेट एक सीरियल कोड में अच्छा है, लेकिन समानांतर कोड के बारे में क्या है? क्या किसी का अनुभव है कि समसामयिक धागे से मेलिंग करने पर वास्तव में बड़ी सरणी के लिए चीजों की गति बढ़ जाती है? या छोरों के लिए सरल openmp समानांतर का भी उपयोग कर रहा है?

Solutions Collecting From Web of "एक ओपनएमपी समानांतर कोड में, समानांतर में चलाने के लिए मैमसेट का कोई फायदा होगा?"

एचपीसी के लोग आमतौर पर कहते हैं कि एक धागा आम तौर पर एक एकल मेमोरी लिंक को पूरा करने के लिए पर्याप्त नहीं होता है, जो आम तौर पर नेटवर्क लिंक के लिए भी सच है। यहाँ एक त्वरित और गंदे ओपन एमएपी सक्षम मेमेस्टर है जो मैंने आपके लिए लिखा था जो शून्य के साथ 2 जीबी स्मृति को दोहराता है। और यहां विभिन्न आर्किटेक्चर पर अलग-अलग थ्रेड के साथ जीसीसी 4.7 का उपयोग करने वाले परिणाम हैं (कई रन रिपोर्टों से अधिकतम मूल्य):

जीसीसी 4.7, कोड के साथ -O3 -mtune=native -fopenmp :

क्वाड-सॉकेट इंटेल Xeon X7350 – अलग-अलग स्मृति नियंत्रक और फ्रंट साइड बस के साथ पूर्व-नेहलम क्वाड-कोर सीपीयू

एकल सॉकेट

 threads 1st touch rewrite 1 1452.223 MB/s 3279.745 MB/s 2 1541.130 MB/s 3227.216 MB/s 3 1502.889 MB/s 3215.992 MB/s 4 1468.931 MB/s 3201.481 MB/s 

(1 टच धीमा है क्योंकि थ्रेड टीम को खरोंच से बनाया जा रहा है और ऑपरेटिंग सिस्टम भौतिक पेजों को malloc(3) द्वारा आरक्षित वर्चुअल एड्रेस स्पेस में मैप करता है।

एक धागा पहले से ही एक CPU <-> एनबी लिंक की स्मृति बैंडविड्थ को संतृप्त करता है (एनबी = उत्तर ब्रिज)

प्रति सॉकेट 1 धागा

 threads 1st touch rewrite 1 1455.603 MB/s 3273.959 MB/s 2 2824.883 MB/s 5346.416 MB/s 3 3979.515 MB/s 5301.140 MB/s 4 4128.784 MB/s 5296.082 MB/s 

एनबी <-> मेमोरी लिंक के पूर्ण मेमोरी बैंडविड्थ को पूरा करने के लिए दो धागे आवश्यक हैं

अक्तूबर-सॉकेट इंटेल Xeon X7550 – 8-रास्ता NUMA सिस्टम ऑक्टो-कोर सीपीयू (सीएमटी अक्षम)

एकल सॉकेट

 threads 1st touch rewrite 1 1469.897 MB/s 3435.087 MB/s 2 2801.953 MB/s 6527.076 MB/s 3 3805.691 MB/s 9297.412 MB/s 4 4647.067 MB/s 10816.266 MB/s 5 5159.968 MB/s 11220.991 MB/s 6 5330.690 MB/s 11227.760 MB/s 

एक मेमोरी लिंक के बैंडविड्थ को पूरा करने के लिए कम से कम 5 धागे आवश्यक हैं

प्रति सॉकेट 1 धागा

 threads 1st touch rewrite 1 1460.012 MB/s 3436.950 MB/s 2 2928.678 MB/s 6866.857 MB/s 3 4408.359 MB/s 10301.129 MB/s 4 5859.548 MB/s 13712.755 MB/s 5 7276.209 MB/s 16940.793 MB/s 6 8760.900 MB/s 20252.937 MB/s 

थ्रेड्स की संख्या के साथ बैंडविड्थ लगभग समानताएं एकल-गर्तिका टिप्पणियों के आधार पर एक यह कह सकता है कि आठ स्मृति लिंकों को पूरा करने के लिए कम से कम 40 थ्रेड्स वितरित किए गए हैं, क्योंकि प्रत्येक सॉकेट में 5 थ्रेड्स वितरित किए जायेंगे

NUMA सिस्टम पर मूल समस्या पहली-स्पर्श मेमोरी नीति है – मेमरी को NUMA नोड पर आवंटित किया जाता है, जहां थ्रेड सबसे पहले किसी विशिष्ट पृष्ठ के निष्पादन के भीतर वर्चुअल पता स्पर्श करता है। थ्रेड माइग्रेशन दूरस्थ पहुँच की ओर जाता है, जो धीमी है, इस तरह की सिस्टम पर थ्रेड पिनिंग (विशिष्ट CPU कोर के लिए बंधन) आवश्यक है। पिन्निग के लिए समर्थित अधिकांश ओपनएमपी रनटाइम्स में उपलब्ध है। जीसीसी अपने libgomp साथ GOMP_CPU_AFFINITY पर्यावरण चर है, इंटेल में KMP_AFFINITY परिवेश चर है, आदि। इसके अलावा, KMP_AFFINITY 4.0 ने स्थानों की विक्रेता-तटस्थ अवधारणा पेश की है।

संपादित करें: पूर्णता के लिए, यहां इंटेल कोर i5-2557M (एचटी और क्यूपीआई के साथ दोहरे कोर सैंडी ब्रिज सीपीयू) के साथ मैकबुक एयर पर 1 GiB सरणी के साथ कोड चलाने के परिणाम हैं। कंपाइलर जीसीसी 4.2.1 (ऐप्पल एलएलएमएम बिल्ड) है

 threads 1st touch rewrite 1 2257.699 MB/s 7659.678 MB/s 2 3282.500 MB/s 8157.528 MB/s 3 4109.371 MB/s 8157.335 MB/s 4 4591.780 MB/s 8141.439 MB/s 

क्यों यह एक भी धागे के साथ उच्च गति? gdb साथ एक छोटी सी खोज से पता चलता है कि memset(buf, 0, len) को ओएस एक्स कंपाइलर द्वारा memset(buf, 0, len) द्वारा अनुवादित किया जाता है और यह कि एक bzero$VARIANT$sse42 के नाम से bzero$VARIANT$sse42 संस्करण को सक्षम किया गया है libc.dylib और रन-टाइम में इस्तेमाल किया। यह MOVDQA निर्देश को एक बार में शून्य के 16 बाइट्स का उपयोग करता है। यही कारण है कि एक धागे के साथ स्मृति बैंडविड्थ लगभग संतृप्त है। VMOVDQA का उपयोग करते हुए एकल-थ्रेडेड एवीएक्स सक्षम संस्करण एक बार में 32 बाइट्स शून्य कर सकता है और शायद मेमोरी लिंक को VMOVDQA

यहां महत्वपूर्ण संदेश यह है कि कभी कभी वेक्टरविज़ेशन और मल्टीथ्रेडिंग ऑपरेशन के लिए गति-अप लाने में ओर्थोगोनल नहीं होते हैं।

ठीक है, हमेशा एल 3 कैश है …

हालांकि, यह बहुत संभावना है कि यह पहले से ही मुख्य मेमोरी बैंडविड्थ से बाध्य होगा; अधिक समानता लाने के लिए चीजों को सुधारने की संभावना नहीं है।