मेरा लक्ष्य से parMap
का उपयोग करके गणना को समानांतर करना है, लेकिन मैं अपने नमूना समारोह में कुछ यादृच्छिकता भी जोड़ना चाहता हूं।तेजी से यादृच्छिकता और शुद्धता के साथ समानांतर गणना?
यादृच्छिकता के बिना मेरी गणना केवल कुछ संख्या क्रंचिंग है और इसलिए यह शुद्ध है और मैं parMap
का उपयोग कर सकता हूं। अच्छे नतीजे पाने के लिए, मुझे प्रत्येक चरण में कई नमूने लेने और परिणामों को औसत करने की आवश्यकता है। नमूनाकरण यादृच्छिक होना चाहिए।
एक समाधान random package का उपयोग करने के लिए हो सकता है, randoms
पर कॉल करें और फिर गणना के दौरान उस सूची का उपभोग करें (गणना के लिए शुद्ध आलसी सूची को पार करके मैं इसे शुद्ध रखूंगा)। दुर्भाग्यवश, यह एक बहुत धीमी यादृच्छिक संख्या जनरेटर है और मुझे बहुत यादृच्छिक संख्या की आवश्यकता है इसलिए मैं mwc-random या mersenne-random (हालांकि, मुझे नहीं लगता कि मेर्सन-यादृच्छिक अभी भी बनाए रखा गया है) का उपयोग करना पसंद करेंगे।
randoms
जैसे फ़ंक्शन लिखने के लिए mwc-random के साथ unsafePerformIO
जैसे कुछ उपयोग करना सुरक्षित है? कुछ ऐसा:
randomsMWC :: Variate a => GenST s -> [a]
randomsMWC g = unsafePerformIO $ unsafeSTToIO $ randomsMWC' g
where
randomsMWC' g = do
a <- uniform g
as <- unsafeInterleaveST $ randomsMWC' g
return (a : as)
क्या मुझे इसके बजाय parallel number generator तक पहुंचने की आवश्यकता है? या क्या मुझे बुलेट काटने और स्वीकार करने की ज़रूरत है कि धीमे यादृच्छिक पैकेज का उपयोग किये बिना मेरा एल्गोरिदम शुद्ध नहीं है?
सुझाव? धन्यवाद!
Mersenne यादृच्छिक-pure64 दोनों तेज है और कई जनरेटर की अनुमति देता है - तो आप प्रति थ्रेड एक हो सकता है। –
@ डॉनस्टवार्ट एकाधिक जेनरेटर पूरी तरह से समानांतर हैकेल के लिए बेकार है।समांतर कोड से थ्रेड-विशिष्ट संसाधनों का उपयोग करने के लिए कोई सुविधा नहीं है, और ऐसा नहीं होना चाहिए - यह गैर-निर्धारणा को पेश करेगा। यह वास्तव में एक कठिन समस्या है। – Carl
कार्ल - ऐसा नहीं। साझा संसाधन पर विवाद से परहेज करते हुए, आप समानांतर फैशन में यादृच्छिक लिंग को डुप्लिकेट कर सकते हैं। उदाहरण के लिए, पेड़-संरचित कमी के बारे में सोचें। –