2009-07-06 11 views
8

मेरा वर्तमान कार्य Monte Carlo Simulation को अनुकूलित करना है जो कि बाधाओं के एक सेट के लिए क्षेत्र द्वारा पूंजी पर्याप्तता आंकड़ों की गणना करता है।सी # मोंटे कार्लो वृद्धिशील जोखिम गणना अनुकूलन, यादृच्छिक संख्या, समांतर निष्पादन

यह बारे में 10 एक्स चल रहा है जहां यह उत्पादन और नंबर या आवश्यक दैनिक रन में होने की आवश्यकता होगी के लिए बहुत धीमी गति से। इसके अतिरिक्त परिणाम आंकड़ों की ग्रैन्युलरिटी को कुछ स्तर पर संभवतः डेस्क स्तर पर डेस्क में सुधार करने की आवश्यकता होगी, मुझे जो कोड दिया गया है वह मूल रूप से एक प्रोटोटाइप है जिसका उपयोग अर्ध उत्पादन क्षमता में व्यावसायिक इकाइयों द्वारा किया जाता है।

अनुप्रयोग है वर्तमान में एकल थ्रेड तो मैं बनाने की आवश्यकता होगी यह मल्टी-थ्रेडेड, System.Threading.ThreadPool पर लग सकता है या माइक्रोसॉफ्ट Parallel Extensions पुस्तकालय लेकिन मैं कम से सर्वर पर नेट 2 करने के लिए विवश कर रहा हूँ यह बैंक इसलिए मुझे इस लड़के के बंदरगाह पर विचार करना पड़ सकता है, http://www.codeproject.com/KB/cs/aforge_parallel.aspx

मैं नेट 3.5 एसपी 1 में नवीनीकृत करने के लिए उन्हें प्राप्त करने के लिए अपना सर्वश्रेष्ठ कोशिश कर रहा हूँ, लेकिन यह इस आकार के एक संगठन में एक प्रमुख व्यायाम है और मेरे अनुबंध समय फ्रेम में संभव नहीं हो सकता।

मैं dotTrace (http://www.jetbrains.com/profiler) के परीक्षण का उपयोग कर आवेदन प्रोफाइल गए हैं। अन्य अच्छे प्रोफाइलर मौजूद हैं? मुफ्त वाले?

बहुत सारे निष्पादन समय खर्च किए गए हैं, जो समान यादृच्छिक संख्या उत्पन्न करते हैं और फिर इसे सामान्य रूप से वितरित यादृच्छिक संख्या में अनुवाद करते हैं। वे एक सी # Mersenne twister कार्यान्वयन का उपयोग कर रहे हैं। मुझे यकीन नहीं है कि उन्हें यह कहां मिला है या यदि वर्दी यादृच्छिक संख्या उत्पन्न करने के लिए यह (या सर्वोत्तम कार्यान्वयन) के बारे में जाने का सबसे अच्छा तरीका है। फिर इस गणना में इस्तेमाल के लिए एक सामान्य रूप से वितरित संस्करण के लिए अनुवाद किया है (मैं अभी तक अनुवाद कोड में delved नहीं किया है)।

इसके अलावा निम्नलिखित का उपयोग कर अनुभव क्या है?

किसी भी विकल्प आप के बारे में पता? मैं एक सी # डेवलपर हूं इसलिए सी # पसंद करेंगे, लेकिन सी ++ पर रैपर कोई समस्या नहीं होनी चाहिए, है?

शायद भी तेजी का लाभ सी ++ कार्यान्वयन। मैं सोच रहा हूं कि इनमें से कुछ पुस्तकालयों में अनुवाद चरण के बिना सामान्य रूप से वितरित यादृच्छिक संख्याओं को सीधे उत्पन्न करने का सबसे तेज़ तरीका होगा। इसके अलावा उनके पास कुछ अन्य कार्य हो सकते हैं जो बाद की गणनाओं में सहायक होंगे।

इसके अलावा कंप्यूटर इस पर एक क्वाड-कोर Opteron 275, 8 जीबी मेमोरी लेकिन विंडोज सर्वर 2003 उद्यम 32 बिट है। क्या मुझे उन्हें 64 बिट ओएस पर अपग्रेड करने की सलाह देनी चाहिए?इस निर्णय का समर्थन करने वाले लेखों के किसी भी लिंक की सराहना की जाएगी।

वैसे भी, आपके पास कोई सलाह और सहायता वास्तव में सराहना की जा सकती है।

+2

आप क्यों मानते हैं कि समस्या पर अधिक धागे फेंकने से मामलों में सुधार होगा? –

+0

वर्तमान में कोड क्वाड कोर बॉक्स पर चलने वाला सिंगल थ्रेडेड है, ओपर्टन 275 सटीक होना चाहिए। कोड अनुक्रमिक रूप से चलाने के लिए लिखा गया है, या तो कंपाइलर या सीएलआर या सीपीयू निर्देश सेट इस कोड को कैसे लेना है और प्रदर्शन में सुधार के समानांतर में इसके भाग को चलाने का प्रयास करने का सबसे अच्छा अनुमान लगा सकता है। या मैं इस कोड को थ्रेडेड समांतर मॉडल में चलाने के लिए लिख सकता हूं ताकि सीएलआर, कंपाइलर, सीपीयू को प्रभावी ढंग से सुझाव दिया जा सके कि समवर्ती रूप से क्या चल सकता है और इन निचले स्तर के निर्देशों को निष्पादन को अनुकूलित करने दें। तुम्हारे विचार? – m3ntat

+1

8 जीबी मेमोरी 32 बिट्स पर 4 जीबी कचरा है ... –

उत्तर

4

मुझे मेर्सन ट्विस्टर जल्दी होने के लिए मिला है। वर्दी विघटन को गॉसियन वितरण में बदलने के लिए समस्या एल्गोरिदम (बॉक्स-मुलर) में हो सकती है। मानक एल्गोरिथ्म लगता है कि:

y1 = sqrt(- 2 ln(x1)) cos(2 pi x2) 
y2 = sqrt(- 2 ln(x1)) sin(2 pi x2) 

कहाँ x1 और x2 वर्दी यादृच्छिक संख्या और y1 और y2 हैं गाऊसी वितरण outputs हैं।

वर्ग जड़ों धीमी गति से कर रहे हैं, लेकिन ट्रिग भी बदतर है, और यह इस विषय पर 0. Taygeta's page को अस्थिर पास एक तेज एक (स्यूडोकोड में) देता है:

  float x1, x2, w, y1, y2; 

    do { 
      x1 = 2.0 * ranf() - 1.0; 
      x2 = 2.0 * ranf() - 1.0; 
      w = x1 * x1 + x2 * x2; 
    } while (w >= 1.0); 

    w = sqrt((-2.0 * ln(w))/w); 
    y1 = x1 * w; 
    y2 = x2 * w; 

वे उपयोग नहीं कर रहे हैं ऐसा कुछ, आप ट्रिगर फ़ंक्शंस से बचने या यादृच्छिक संख्याओं को पूर्व-उत्पन्न करने से चीजों को थोड़ा सा गति देने में सक्षम हो सकते हैं।

+0

एक नोट के रूप में, कई आधुनिक प्रोसेसर के पास पाप और कॉस की एक साथ गणना के लिए असेंबली निर्देश होता है, और यह अनुक्रमिक रूप से दोनों को कॉल करने से बहुत सस्ता है। यह किसी मानक पुस्तकालयों में उपलब्ध नहीं है, afaik, क्योंकि यह प्रोसेसर-विशिष्ट सुविधा है। –

+0

धन्यवाद @ आर उबेन, क्या आपका प्रस्ताव इस http://en.wikipedia.org/wiki/Box-Muller_transformation जैसा ही है या यह कुछ अलग है? – m3ntat

+0

हां, वे ध्रुवीय रूप का वर्णन करते हैं। यह अस्वीकृति नमूना है, इसलिए आप कुछ संख्याओं को फेंक देते हैं, लेकिन यह अभी भी बहुत तेजी से समाप्त होता है। हालांकि मैं बैंकिंग में भी काम करता हूं, मैं आनंद के लिए ऐसा कर रहा था - रे ट्रेसर में वैश्विक रोशनी। इससे कोई फर्क पड़ता है। यदि गति अभी भी एक समस्या है, तो आप कितने रनों का उपयोग करते हैं, इस पर निर्भर करते हुए, आप दैनिक रनों के बीच कई सौ मिलियन ऑफ़लाइन उत्पन्न कर सकते हैं, और केवल आवश्यकतानुसार उन्हें पढ़ सकते हैं। फिर दुकान समाप्त होने पर पीढ़ी पर वापस आना। –

1

क्या आपने a profiler at your code पर इशारा किया है? मैंने ऐसे मामलों को देखा है जहां सरल फिक्सेस बहुत महत्वपूर्ण सुधार प्राप्त करते हैं। फ़ील्ड पर कुछ गुणों को स्विच करने की तरह।

+0

में नया हूं, मैंने डॉट्रेस के परीक्षण के साथ प्रयास किया है लेकिन परिणाम उस दानेदार नहीं थे, अगर उनके पास नि: शुल्क परीक्षण है तो मुझे रेडगेट के साथ प्रयास करना होगा? – m3ntat

+0

मुझे लगता है कि वे करते हैं, चींटियों ने मेरे लिए दिन का एक गुच्छा बचा लिया है। –

0

एक बड़े पैमाने पर अनुकरण के लिए पहली जगह में नेट का उपयोग करने के लिए विवश किया जा रहा है आप काफी प्रदर्शन का एक सा सही सामने खर्च करने जा रहा है ... लेकिन यह है कि ने कहा ...

यदि आप मेर्सन ट्विस्टर के शुद्ध सी # कार्यान्वयन को चलाते हुए, यह संभावना है कि आपके द्वारा किए जा सकने वाले सभी प्रदर्शनों में आपको मुश्किल समय लगेगा। यदि आप मेर्सन ट्विस्टर reference implementation देखें तो आप देखेंगे कि उनके पास एक सी संस्करण है जिसे एसएसई-सक्षम प्रोसेसर के लिए अत्यधिक अनुकूलित किया गया है - यह बहुत तेज़ है। मुझे विश्वास नहीं है कि यह सी # (या कम से कम, मुझे पता नहीं है) एसएसई निर्देशों के उपयोग को उस अनुकूलन के स्तर के साथ मजबूर करने के लिए संभव है। मैं मेर्सन ट्विस्टर पुस्तकालयों के आस-पास एक सी ++/सीएलआई रैपर (या एक पी/इनवोक रैपर) लिखने का सुझाव दूंगा, और यह देखकर कि यह आपके प्रदर्शन को कैसे प्रभावित करता है। हालांकि, आपको अपने प्रदर्शन को प्रभावित करने वाले प्रबंधित-अप्रबंधित Marhsalling से सावधान रहना होगा, क्योंकि मैंने इस मुद्दे के बारे में SO पर अन्य पोस्ट देखी हैं (हालांकि मुझे अभी उन्हें नहीं मिल रहा है ...)।

मैं यह कहने के लिए कुछ लौ उत्पन्न कर सकता हूं, लेकिन यदि प्रदर्शन आपके आवेदन में एक महत्वपूर्ण चिंता है, तो अच्छी तरह से लिखित सी या सी ++ लगभग किसी भी प्रबंधित या व्याख्या की गई भाषा के लिए बेहतर होने जा रही है।

+2

मैं वास्तव में आपके अंतिम बयान के साथ काफी दृढ़ता से असहमत हूं ... सी # बहुत अच्छा प्रदर्शन कर सकता है। इसे प्रोफाइलिंग की आवश्यकता होती है, लेकिन मेरे अनुभव में, सी # को प्रोफाइल करना बहुत आसान है और इसे उस बिंदु में सुधारना है जहां यह सी और सी ++ से बेहतर प्रदर्शन कर सकता है - खासकर यदि आप सही पुस्तकालयों के फायदे लेते हैं, और समझते हैं कि कसकर, अत्यधिक प्रदर्शन कोड कैसे लिखना है सी # में –

+1

मैं भी रचनात्मक रूप से असहमत होना चाहता हूं :) – peterchen

+1

@Reed - मुझे स्पष्टीकरण दें - मैं प्रोफाइलिंग की आसानी, न ही उपलब्ध उपकरण, और अनुकूलित करने में कठिनाई के बारे में बात नहीं कर रहा हूं। मैं जोर दे रहा हूं कि किसी व्याख्या या प्रबंधित भाषा में लिखे गए किसी भी कार्यक्रम के लिए, यह साबित किया जा सकता है कि एक अप्रबंधित भाषा में समान या बेहतर प्रदर्शन के साथ एक कार्यात्मक रूप से बराबर प्रोग्राम लिखा जा सकता है। –

0

मेरा अनुभव यह है कि सी # बनाम सी ++ का सापेक्ष प्रदर्शन काफी हद तक निर्भर करता है जो आप कर रहे हैं। कि यहां का एक बड़ा चर्चा:

C++ performance vs. Java/C#

गणित (कहना वेक्टर भौतिक विज्ञान गणना) C++ कर तंग छोरों के लिए की तुलना में सी # एक 2-3 गुना तेजी से है, हालांकि पर्फ़ Sqrt तरह अंतर्निहित कार्य (प्रभुत्व किया जा सकता है)।

मैंने एक मिश्रित भाषा दृष्टिकोण लिया है, (पुनः) सी ++/ओपनएमपी में एक धीमी कोड को प्रबंधित सी ++/सीएलआई रैपर के साथ कार्यान्वित किया है। यह आपको केवल "आपके द्वारा उपयोग किए जाने वाले कार्यों के लिए भुगतान" करने की अनुमति देता है। एक बार जब आप सी के लटका मिलता है ++/CLI इसे चलाने चीजों को पाने के लिए बहुत आसान है

http://msdn.microsoft.com/en-us/library/ms235281.aspx

:

कैसे C++/CLI यहाँ के साथ देशी C/C++ रैप करने के लिए का एक सारांश नहीं है।

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