2009-03-02 28 views
5

Tôi có một số mã Fortran90 song song trong đó mỗi luồng cần tạo cùng một chuỗi các số ngẫu nhiên.Máy phát số ngẫu nhiên đồng bộ an toàn chủ đề

Tôi có trình tạo số ngẫu nhiên có vẻ không an toàn cho luồng, vì, đối với một hạt giống nhất định, tôi hoàn toàn không thể lặp lại cùng một kết quả mỗi khi tôi chạy chương trình.

Tôi đã lướt không thành công (gần như) toàn bộ trang web đang tìm kiếm một số mã RNG an toàn chỉ. Bất cứ ai có thể cung cấp cho tôi (liên kết đến) mã của một?

Cảm ơn trước!

+0

@Eric: Nice rewrite. – dmckee

+0

Ứng dụng song song như thế nào? Bạn có thể xử lý điều này một cách khác nhau nếu bạn đang sử dụng một cái gì đó như MPI. –

+0

Bây giờ nó được song song bằng cách sử dụng OpenMP nhưng trong một tương lai gần, tôi sẽ song song nó bằng cách sử dụng MPI – Bellman

Trả lời

3

Hầu hết các trình tạo số ngẫu nhiên lặp lại cần có trạng thái ở một dạng nào đó. Không có nhà nước, họ không thể làm gì tiếp theo. Để giữ an toàn cho luồng, bạn cần một cách để giữ trạng thái của chính mình (nghĩa là nó không thể là toàn cầu).

0

Các phương án dường như là:

  • Sử dụng một đối tượng đồng bộ hóa (chẳng hạn như một mutex) trên giá trị hạt giống của máy phát điện. Điều này sẽ không may serialise mã của bạn trên các truy cập đến phát
  • Sử dụng thread-địa phương lưu trữ trong các máy phát điện vì vậy mỗi thread được hạt riêng của mình - điều này có thể gây ra statstical khó khăn cho ứng dụng của bạn
  • Nếu nền tảng của bạn hỗ trợ phù hợp với hoạt động nguyên tử , sử dụng hạt giống đó trên hạt (có thể là không, tuy nhiên)

Không phải là danh sách rất đáng khích lệ. Và để thêm vào nó, tôi không có ý tưởng làm thế nào để thực hiện bất kỳ trong số họ trong FORTRAN!

+0

Bah. Fortran 90 không kém khả năng hơn C. –

+0

Tôi biết - FORTRAN IV là ngôn ngữ đầu tiên của tôi. Tôi có nghĩa là "cá nhân tôi" không biết làm thế nào để thực hiện chúng trong fortran hiện đại. –

2

Khi bạn nói "cần phải tạo ra cùng một chuỗi các số ngẫu nhiên" bạn có nghĩa là

  • Mỗi thread cần phải tạo ra một dòng số giống với các chủ đề khác? Điều này ngụ ý việc chọn hạt giống trước khi bóc ra các luồng, sau đó khởi tạo PRNG chuỗi địa phương trong mỗi luồng có cùng một hạt giống.

hoặc

  • Bạn muốn để có thể lặp lại cùng một chuỗi các số giữa chạy khác nhau của chương trình, nhưng mỗi thread tạo ra nó là chuỗi độc lập của riêng? Trong trường hợp này, bạn vẫn không thể chia sẻ một PRNG đơn lẻ vì chuỗi hoạt động chuỗi không xác định. Vì vậy, hạt giống một PRNG duy nhất với một hạt giống được biết trước khi tung ra chủ đề, và sử dụng nó để tạo ra các hạt giống ban đầu cho các chủ đề. Sau đó, bạn khởi tạo trình tạo luồng địa phương trong mỗi chuỗi ...

Trong mỗi trường hợp này bạn nên lưu ý những gì Neil Butterworth nói về số liệu thống kê: hầu hết các bảo đảm bình thường mà PRNG muốn khẳng định là không đáng tin cậy khi dòng hỗn hợp được tạo ra theo cách này.


Trong cả hai trường hợp, bạn cần PRNG theo chuỗi địa phương. Tôi không biết những gì có sẵn trong f90 ... nhưng bạn cũng có thể viết bạn sở hữu (tra cứu Mersenne Twister, và viết một routne mà có trạng thái lưu như một tham số ...).

Trong Fortran 77, điều này sẽ giống như thế

 function PRNGthread (state) 

     double state(statesize) 

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

     PRNGthread = result 
     return 

và mỗi chủ đề của bạn nên duy trì một vector trạng thái riêng biệt, mặc dù tất cả sẽ sử dụng giá trị ban đầu tương tự.

1

Tôi hiểu rằng bạn cần mọi chuỗi để tạo ra cùng một luồng các số ngẫu nhiên.

Trình tạo ngẫu nhiên giả rất tốt sẽ tạo ra một dòng số có thể tái tạo và khá nhanh là MT19937. Chỉ cần chắc chắn rằng bạn tạo ra các hạt giống trước khi sinh ra các chủ đề, nhưng tạo ra một trường hợp riêng biệt của MT trong mỗi thread (làm cho trường hợp của chủ đề MT địa phương). Bằng cách đó, nó sẽ được đảm bảo rằng mỗi MT sẽ tạo ra cùng một dòng số.

1

Làm thế nào về SPRNG? Tôi đã không thử nó mặc dù bản thân mình.

Các vấn đề liên quan