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ự.
@Eric: Nice rewrite. – dmckee
Ứ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. –
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