2011-11-29 12 views
8

मुझे एक ही फ़ंक्शन चलाने में दिलचस्पी है जो समानांतर फैशन में मल्टीप्ल कर्नेल पर तर्कों के विभिन्न मूल्यों के साथ कुछ मोंटे कार्लो मूल्यांकन करता है। मैं यह भी सुनिश्चित करना चाहता हूं कि पूरे फ़ंक्शन कर्नेल में वितरित किए जा रहे फ़ंक्शन के भीतर गणना के बिना उसी कर्नेल पर चलता है। उदाहरण के लिए, मैं एक समारोह (जानबूझ कर सरलीकृत) मान लीजिएगणित में समांतर प्रोग्रामिंग

f[a_, b_] := Module[{}, RandomReal[{a, b}]] 


In[1]:= LaunchKernels[] 

Out[1]= {KernelObject[1, "local"], KernelObject[2, "local"], 
KernelObject[3, "local"], KernelObject[4, "local"], 
KernelObject[5, "local"], KernelObject[6, "local"], 
KernelObject[7, "local"]} 

SeedRandom[795132, Method -> "ParallelGenerator"]; 

m1 = 1; m2 = 2; m3 = 3; m4 = 4; m5 = 5; m6 = 6; m7 = 7; m8 = 8; 

DistributeDefinitions[f, m1, m2, m3, m4, m5, m6, m7, m8]; 

अब मैं च [एम 1, एम 2], च [एम 3, एम 4], च [M5, M6], च [m7, M8 चलाना चाहते हैं ] एफ [एम 9, एम 10] पांच अलग-अलग कर्नेल पर इन कर्नेलों में कोई सूचना हस्तांतरण नहीं है, यानी, अलग-अलग कर्नेल में यादृच्छिक संख्याओं की एक अलग धारा के साथ।

गणित के भीतर कोई ऐसा कैसे कर सकता है?

+1

मज़ा लोग है, मैं इस एक बाहर बैठा हूँ। –

+1

@ श्री विज़ार्ड: जब आप प्रतिस्पर्धा करने के लिए आसपास नहीं हैं तो यह कोई मजेदार नहीं है :) –

उत्तर

3

शायद आप $KernelID और $ProcessID के साथ व्यक्तिगत कर्नल बीज कर सकते हैं?

ParallelEvaluate[ 
Print[$KernelID $ProcessID]; 
SeedRandom[$KernelID $ProcessID] 
] 

और यह पाँच भिन्न कर्नलों के पास जाना चाहिए (FinestGrained विकल्प एक नया कर्नेल के लिए हर मूल्यांकन लेता है):

ParallelTable[$KernelID -> f[2 i - 1, 2 i], {i, 5}, Method -> "FinestGrained"] 

जब i (अधिकतम 5) कर्नेल की संख्या से अधिक है (8), यह मुद्दों में भागने जा रहा है, यानी f[13,14] उसी बीज का उपयोग f[2,3] के रूप में कर सकता है।

+0

क्या यह डिफ़ॉल्ट रूप से नहीं होता है? [यहां] देखें (http://reference.wolfram.com/mathematica/tutorial/RandomNumberGeneration.html), यह कहता है * "समांतर कंप्यूटेशंस के लिए जेनरेटर से स्वतंत्र यादृच्छिक संख्या उत्पन्न करने वाले प्रत्येक थ्रेड पर जनरेटर होना बहुत फायदेमंद है अन्य धागे पर। गणित में समानांतर गणना में उपयोग किए जाने वाले प्रत्येक धागे को शून्य से शुरू होने वाली एक अनूठी अनुक्रमणिका दी जाएगी (और आमतौर पर अनुक्रमिक रूप से $ प्रोसेसर काउंटी के माध्यम से जा रही है) जिसका उपयोग प्रत्येक थ्रेड पर अलग-अलग बीज और जनरेटर देने के लिए किया जाएगा। "* – Szabolcs

+0

मुझे चाहिए एक ही कर्नेल पर होने वाले फ़ंक्शन के भीतर सभी गणना। यदि फ़ंक्शन में एकाधिक (10000 कहें) यादृच्छिक ड्रॉ शामिल हैं तो सभी को एक ही स्ट्रीम से आना चाहिए। – asim

2

मुझे विश्वास है कि आप जो खोज रहे हैं वह BlockRandom है।

documentation के अनुसार

,

BlockRandom[expr] 
evaluates expr with all pseudorandom generators localized, 
so that uses of SeedRandom, RandomInteger, and related functions 
within the evaluation of expr do not affect subsequent pseudorandom sequences. 

तो फिर तुम हो सकता है:

f[a_, b_] := BlockRandom[{}, RandomReal[{a, b}] 
संबंधित मुद्दे