2009-03-02 14 views
5

मैं कुछ समानांतर Fortran90 कोड जिसमें प्रत्येक धागा यादृच्छिक संख्या का उसी क्रम उत्पन्न करने के लिए की आवश्यकता है।थ्रेड-सुरक्षित वर्दी यादृच्छिक संख्या जनरेटर

मैं एक यादृच्छिक संख्या जनरेटर है कि धागे असुरक्षित प्रतीत हो रहा है, क्योंकि किसी दिए गए बीज के लिए, मैं पूरी तरह से एक ही परिणाम हर बार मैं प्रोग्राम चलाने को दोहराने के लिए असमर्थ हूँ है।

मैं असफल सर्फ़ (लगभग) पूरे वेब एक धागा सुरक्षित RNG से कुछ कोड की तलाश। क्या कोई मुझे एक के कोड (लिंक) के साथ प्रदान कर सकता है?

अग्रिम धन्यवाद!

+0

@Eric: अच्छा पुनर्लेखन। – dmckee

+0

एप्लिकेशन समानांतर कैसे है? यदि आप एमपीआई जैसे कुछ उपयोग कर रहे हैं तो आप इसे अलग तरीके से संभाल सकते हैं। –

+0

अब तक इसे ओपनएमपी का उपयोग करके समानांतर किया गया है लेकिन निकट भविष्य में, मैं एमपीआई – Bellman

उत्तर

6

एक अच्छा Pseudorandom number generator Fortran90 के लिए Intel Math Kernel Vector Statistical Library में पाया जा सकता। वे धागे सुरक्षित हैं। इसके अलावा, इसे थ्रेडसेफ क्यों होना चाहिए? यदि आप चाहते हैं कि प्रत्येक थ्रेड एक ही सूची प्राप्त करे, तो प्रत्येक थ्रेड के लिए एक ही बीज के साथ एक नया पीआरएनजी तुरंत चालू करें।

3

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

0

विकल्प होने लगते हैं:

  • जनरेटर के बीज मूल्य पर एक तुल्यकालन वस्तु (जैसे एक म्युटेक्स) का प्रयोग करें। इस एप्लिकेशन को अपने
  • के लिए statstical समस्याएँ हो सकती हैं अपने मंच एक का समर्थन करता है - यह दुर्भाग्य
  • जनरेटर में
  • उपयोग धागे की स्थानीय भंडारण इसलिए प्रत्येक धागा अपनी ही बीज हो जाता है जनरेटर से पहुंच पर अपने कोड serialise होगा उपयुक्त परमाणु आपरेशन, का उपयोग बीज पर (यह शायद नहीं है, हालांकि होगा)

नहीं एक बहुत ही उत्साहजनक सूची, मुझे पता है। और इसमें जोड़ने के लिए, मुझे नहीं पता कि फोरट्रान में उनमें से किसी को कैसे कार्यान्वित किया जाए!

+0

बह का उपयोग करके इसे समानांतर कर दूंगा। फोरट्रान 90 सी –

+0

से कम सक्षम नहीं है मुझे पता है - फोरट्रान चतुर्थ मेरी पहली भाषा थी। मेरा मतलब था कि "मैं व्यक्तिगत रूप से" आधुनिक किले में उन्हें लागू करने के बारे में नहीं जानता। –

2

जब आप कहते हैं कि "यादृच्छिक संख्या का उसी क्रम उत्पन्न करने के लिए की जरूरत है" क्या आपका मतलब है कि

  • प्रत्येक धागा अन्य धागा करने के लिए समान संख्या की एक धारा उत्पन्न करने के लिए की जरूरत है करते हैं? यह, धागे बंद छीलने से पहले बीज को चुनने का मतलब तो वही बीज के साथ एक सूत्र में एक धागे की स्थानीय PRNG instantiating।

या

  • आप कार्यक्रमों के विभिन्न रन के बीच संख्या के उसी क्रम को दोहराने के लिए सक्षम होना चाहते हैं, लेकिन प्रत्येक धागा यह अपनी स्वतंत्र अनुक्रम है उत्पन्न करता है? इस मामले में, आप अभी भी एक पीआरएनजी साझा नहीं कर सकते हैं क्योंकि थ्रेड ऑपरेशन अनुक्रम गैर-निर्धारक है। तो थ्रेड लॉन्च करने से पहले एक ज्ञात बीज के साथ एक एकल पीआरएनजी बीज करें, और धागे के लिए शुरुआती बीज उत्पन्न करने के लिए इसका इस्तेमाल करें। फिर आप प्रत्येक धागे में थ्रेड-स्थानीय जेनरेटर को तत्काल बनाते हैं ...

इन मामलों तुम क्या Neil Butterworth आँकड़ों के बारे में कहते हैं कि नोट करना चाहिए में से प्रत्येक में: सामान्य गारंटी देता है कि PRNG पर दावा करना चाहते का सबसे विश्वसनीय नहीं जब मिश्रण धाराओं इस तरह से उत्पन्न कर रहे हैं।


दोनों मामलों में आपको थ्रेड-स्थानीय पीआरएनजी की आवश्यकता है। मुझे नहीं पता कि f90 में क्या उपलब्ध है ... लेकिन आप स्वयं भी लिख सकते हैं (लुकअप Mersenne Twister, और एक राउटन लिखें जो सहेजे गए राज्य को पैरामीटर के रूप में लेता है ...)।

fortran 77 में, इस तरह

 function PRNGthread (state) 

     double state(statesize) 

c stuff happens here which uses and manipulates the state vector... 

     PRNGthread = result 
     return 

और अपने सूत्र एक अलग राज्य वेक्टर बनाए रखना चाहिए में से प्रत्येक के कुछ ऐसा दिखाई देगा, हालांकि सभी एक ही प्रारंभिक मूल्य का प्रयोग करेंगे।

1

मुझे समझ में आता है कि आपको यादृच्छिक संख्याओं की एक ही स्ट्रीम का उत्पादन करने के लिए हर धागे की आवश्यकता है।

एक बहुत अच्छा छद्म यादृच्छिक जेनरेटर जो संख्याओं की पुनरुत्पादन योग्य धारा उत्पन्न करेगा और काफी तेज है MT19937 है। बस सुनिश्चित करें कि आप थ्रेड को दूर करने से पहले बीज उत्पन्न करते हैं, लेकिन प्रत्येक थ्रेड में एमटी का एक अलग उदाहरण उत्पन्न करते हैं (एमटी थ्रेड स्थानीय का उदाहरण बनाते हैं)। इस तरह यह गारंटी दी जाएगी कि प्रत्येक एमटी संख्याओं की एक ही धारा का उत्पादन करेगा।

1

कैसे SPRNG के बारे में? हालांकि मैंने इसे खुद कोशिश नहीं की है।

1

मैंने मेर्सन ट्विस्टर/MT19973 के थ्रेड-सुरक्षित फोरट्रान 90 संस्करण को कोड किया। पीआरएनजी की स्थिति व्युत्पन्न प्रकार (randomNumberSequence) में सहेजी जाती है, और आप जेनरेटर को बीज करने के लिए प्रक्रियाओं का उपयोग करते हैं या अनुक्रम में अगला तत्व प्राप्त करते हैं।

देखें http://code.google.com/p/i3rc-monte-carlo-model/source/browse/trunk/Code/RandomNumbersForMC.f95