दो अंक - पहला, उदाहरण फोरट्रान में है, लेकिन मुझे लगता है कि इसे किसी भी भाषा के लिए रखना चाहिए; दूसरा, यादृच्छिक संख्या जनरेटर में निर्मित वास्तव में यादृच्छिक नहीं हैं और अन्य जनरेटर मौजूद हैं, लेकिन हम जो भी कर रहे हैं उसके लिए हम उनका उपयोग करने में रूचि नहीं रखते हैं।यादृच्छिक संख्या के बीज के लिए संभावित स्रोत
यादृच्छिक बीज पर अधिकतर चर्चाएं स्वीकार करती हैं कि यदि कार्यक्रम रन-टाइम पर बीज नहीं लेता है, तो बीज संकलन समय पर उत्पन्न होता है। इसलिए, प्रोग्राम चलाने के हर बार संख्याओं का एक ही अनुक्रम उत्पन्न होता है, जो यादृच्छिक संख्याओं के लिए अच्छा नहीं है। इसे दूर करने का एक तरीका सिस्टम घड़ी के साथ यादृच्छिक संख्या जनरेटर को बीज करना है।
हालांकि, बहु-कोर मशीन पर एमपीआई के साथ समानांतर में चलते समय, हमारे लिए सिस्टम घड़ी दृष्टिकोण उसी प्रकार की समस्याएं उत्पन्न करता है। जबकि अनुक्रम रन से चलने के लिए बदल गए, सभी प्रोसेसर को एक ही सिस्टम घड़ी मिली और इस प्रकार एक ही यादृच्छिक बीज और एक ही अनुक्रम मिला।
PROGRAM clock_test
IMPLICIT NONE
INCLUDE "mpif.h"
INTEGER :: ierr, rank, clock, i, n, method
INTEGER, DIMENSION(:), ALLOCATABLE :: seed
REAL(KIND=8) :: random
INTEGER, PARAMETER :: OLD_METHOD = 0, &
NEW_METHOD = 1
CALL MPI_INIT(ierr)
CALL MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr)
CALL RANDOM_SEED(SIZE=n)
ALLOCATE(seed(n))
DO method = 0, 1
SELECT CASE (method)
CASE (OLD_METHOD)
CALL SYSTEM_CLOCK(COUNT=clock)
seed = clock + 37 * (/ (i - 1, i = 1, n) /)
CALL RANDOM_SEED(put=seed)
CALL RANDOM_NUMBER(random)
WRITE(*,*) "OLD Rank, dev = ", rank, random
CASE (NEW_METHOD)
OPEN(89,FILE='/dev/urandom',ACCESS='stream',FORM='UNFORMATTED')
READ(89) seed
CLOSE(89)
CALL RANDOM_SEED(put=seed)
CALL RANDOM_NUMBER(random)
WRITE(*,*) "NEW Rank, dev = ", rank, random
END SELECT
CALL MPI_BARRIER(MPI_COMM_WORLD, ierr)
END DO
CALL MPI_FINALIZE(ierr)
END PROGRAM clock_test
कौन सा जब 2 कोर के साथ मेरी कार्य केंद्र पर चलाने के लिए, देता है::
तो निम्न उदाहरण कोड पर विचार
OLD Rank, dev = 0 0.330676306089146
OLD Rank, dev = 1 0.330676306089146
NEW Rank, dev = 0 0.531503215980609
NEW Rank, dev = 1 0.747413828750221
तो, हम /dev/urandom
से बीज को पढ़ कर घड़ी मुद्दे पर विजय बजाय। इस तरह प्रत्येक कोर को अपना खुद का यादृच्छिक नंबर मिलता है।
अन्य बीज दृष्टिकोण क्या हैं जो बहु-कोर, एमपीआई सिस्टम में काम करेंगे और फिर भी प्रत्येक कोर पर दौड़ने के लिए अद्वितीय होंगे?
http://stackoverflow.com/questions/1554958/how-different-do-random-seeds-need-to-be पर चर्चा के आधार पर और आलेख उत्तर में उद्धृत किया गया है, बस उस समय रैंक जोड़ रहा है कुछ गैर-छद्म-यादृच्छिक संख्या उत्पन्न करता है क्योंकि सभी बीज रैखिक होंगे। लेकिन अगर केवल छद्म-यादृच्छिक ठीक है, तो समय + रैंक दृष्टिकोण बहुत सरल और मंच स्वतंत्र है। – tpg2114