2012-06-27 21 views
86

work में Gibbs sampling के साथ, मैं RVar का बहुत अच्छा उपयोग कर रहा हूं, जो मेरे विचार में यादृच्छिक संख्या पीढ़ी के लिए एक आदर्श आदर्श इंटरफ़ेस प्रदान करता है। अफसोस की बात है, मैं नक्शे में monadic कार्यों का उपयोग करने में असमर्थता के कारण रेपा का उपयोग करने में असमर्थ रहा हूं।रेपा एरे पर समानांतर मानचित्र एम

स्पष्ट रूप से monadic नक्शे सामान्य रूप में parallelized नहीं किया जा सकता है, यह RVar एक इकाई जहां प्रभाव सुरक्षित रूप से parallelized किया जा सकता (कम से कम सिद्धांत रूप में कम से कम एक उदाहरण हो सकता है कि मुझे लगता है

, मैं के साथ बहुत परिचित नहीं हूँ RVar की आंतरिक कार्यप्रणाली)। अर्थात्, मैं, निम्नलिखित की तरह कुछ लिखना चाहते हैं

drawClass :: Sample -> RVar Class 
drawClass = ... 

drawClasses :: Array U DIM1 Sample -> RVar (Array U DIM1 Class) 
drawClasses samples = A.mapM drawClass samples 

जहां A.mapM कुछ ऐसा दिखाई देगा,

mapM :: ParallelMonad m => (a -> m b) -> Array r sh a -> m (Array r sh b) 

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

Intuitively, ऐसा लगता है कि यह एक ही विचार कुछ अन्य monads को सामान्य हो सकता है।

तो, मेरा सवाल यह है कि: क्या कोई मोनैड के ParallelMonad वर्ग का निर्माण कर सकता है जिसके लिए प्रभाव सुरक्षित रूप से समांतर किया जा सकता है (संभवतः कम से कम RVar) में निवास किया जा सकता है?

यह कैसा दिख सकता है? इस वर्ग में कौन से अन्य मठवासी रह सकते हैं? क्या दूसरों ने रिपै में काम करने की संभावना पर विचार किया है?

अंत में, यदि समानांतर monadic कार्यों की इस धारणा को सामान्यीकृत नहीं किया जा सकता, किसी को भी RVar (जहां यह बहुत उपयोगी हो जाएगा) के विशिष्ट मामले में यह काम करने के लिए किसी भी अच्छा तरीका देखना है? समांतरता के लिए RVar देना बहुत मुश्किल व्यापार-बंद है।

+1

मुझे लगता है कि चिपकने वाला बिंदु "प्रत्येक थ्रेड के लिए एक नया यादृच्छिक बीज खींच रहा है" - यह कदम कैसे काम करना चाहिए, और सभी थ्रेड लौटने के बाद बीज को फिर से कैसे विलय किया जाना चाहिए? –

+1

आरवीआर इंटरफ़ेस को निश्चित रूप से किसी दिए गए बीज के साथ एक नए जनरेटर को बढ़ाने के लिए कुछ अतिरिक्त जोड़ों की आवश्यकता होगी। माना जाता है कि यह स्पष्ट नहीं है कि इस काम के यांत्रिकी और यह काफी 'रैंडमसोर्स' विशिष्ट प्रतीत होता है। बीज बनाने में मेरा निष्पक्ष प्रयास कुछ सरल और संभवतः बहुत गलत करना होगा जैसे कि तत्वों का वेक्टर ('एमडब्ल्यूसी-यादृच्छिक' के मामले में) और पहले तत्व के लिए बीज बनाने के लिए प्रत्येक तत्व में 1 जोड़ें, दूसरे कार्यकर्ता के लिए 2 जोड़ें, आदि। अगर आपको क्रिप्टोग्राफिक-गुणवत्ता एन्ट्रॉपी की आवश्यकता होती है तो अपर्याप्त अपर्याप्त; उम्मीद है कि अगर आपको सिर्फ यादृच्छिक चलना चाहिए तो ठीक है। – bgamari

+0

मैं 'fillChunkedIOP' का उपयोग करने के लिए जो कुछ पूछ रहा हूं उसके समान कुछ करने में सक्षम हूं। – kosmikus

उत्तर

4

यह शायद PRNGs के इस स्वाभाविक अनुक्रमिक के कारण प्रकृति करने के लिए एक अच्छा विचार नहीं है। इसके बजाय, आप इस प्रकार अपने कोड संक्रमण के लिए चाहते हो सकता है:

  1. एक आईओ समारोह घोषित (main हैं या आप जो है)।
  2. आपको जितनी जरूरत हो उतनी यादृच्छिक संख्या पढ़ें।
  3. अपने रेपा कार्यों पर (अब शुद्ध) संख्याएं पास करें।
+0

सांख्यिकीय स्वतंत्रता बनाने के लिए प्रत्येक समानांतर धागे में प्रत्येक पीआरएनजी में जला देना संभव होगा? –