tôi cảm thấy cần phải xây dựng về vấn đề này. Không đặt lại hạt giống trong vòng lặp parfor
và hơn nữa không sử dụng thuật toán Mersenne Twister song song (bạn sẽ nhận được kết quả kém độc lập về thống kê).
Lý do bạn nhận được kết quả khác nhau là do thuật toán khác nhau do các thuộc tính thống kê mà các số này nên duy trì. Trong một hồ bơi song song MATLAB sẽ thiết lập thuật toán 'combRecursive' và thiết lập một subStream khác nhau trên mỗi nhân viên, do đó, đối với các số ngẫu nhiên, bạn nên thực hiện. Hơn nữa, parfor
vòng lặp không đảm bảo —
- Thứ tự mà các vòng tiến hành,
- mà người lao động sẽ được thực hiện từng mảnh, hoặc
- bao nhiêu lần lặp được thực hiện trên mỗi công nhân.
Do đó, việc tạo các số ngẫu nhiên trong các vòng parfor thường sẽ không trả về cùng số ngẫu nhiên ngay cả với cùng một trạng thái trên mỗi công nhân. Thay vì tạo ra một RandStream với subStreams của thuật toán combRecursive, thiết lập các dòng toàn cầu trên mỗi công nhân trong một khối spmd, sau đó tạo ra các con số trên mỗi công nhân trong một khối spmd:
p = gcp; % Get or open a pool
numWork = p.NumWorkers; % Get the number of workers
s = RandStream.create('mrg32k3a','NumStreams',numWork,...
'CellOutput',true); % create numWork independent streams
n = 200; % number of values to generate on each worker
spmd
RandStream.setGlobalStream(s{labindex});
x = rand(1,n);
end
% I generate row vectors as the Composite matrix x will return a
% comma-separated list using the syntax, x{:}, which can then be
% concatenated into a single vector:
randVals2 = [x{:}]';
Nguồn
2015-08-26 19:01:05
Thú vị. Tôi không thể tìm thấy thay đổi của trình tạo mặc định được đề cập ở bất kỳ đâu trong tài liệu. Bạn có biết điều này có ảnh hưởng đến 'rand' và' randn' không? Nhân tiện, bạn có thể chấp nhận câu trả lời của riêng bạn cho câu hỏi của bạn. – horchler
+1 Rất thú vị. Hãy cẩn thận với hack này trong các bối cảnh mã lớn hơn - có vẻ như các công nhân song song hiện đã được thiết lập để có các trạng thái RNG gần song song và các cuộc gọi 'parfor' hoặc DCT tương lai không đặt lại hạt giống có thể gây lạ các kết quả. Việc tạo trước các số ngẫu nhiên bên ngoài vòng lặp có thể sạch hơn nếu bạn cần tổng số lần lặp lại. –
tôi có hoàn cảnh ngược lại. Bạn có thể trả lời câu hỏi của tôi không: http: //stackoverflow.com/questions/40190243/matlab-generating-random-numbers-in-parfor-or-allel-computing? Noredirect = 1 # comment67680730_40190243 – kyle