Ниже приведен пример синхронизации начальной загрузки параллельно и последовательно. В примере генерируются данные из смеси двух гауссов, строится непараметрическая оценка полученных данных и используется загрузочная карта для получения ощущения изменчивости выборки.
Создайте данные:
% Generate a random sample of size 1000, % from a mixture of two Gaussian distributions x = [randn(700,1); 4 + 2*randn(300,1)];
Построить непараметрическую оценку плотности из данных:
latt = -4:0.01:12; myfun = @(X) ksdensity(X,latt); pdfestimate = myfun(x);
Загрузите оценку, чтобы получить представление о ее изменчивости выборки. Запустите загрузочную карту в последовательном формате для сравнения синхронизации.
tic;B = bootstrp(200,myfun,x);toc Elapsed time is 10.878654 seconds.
Параллельное выполнение начальной загрузки для сравнения синхронизации:
mypool = parpool()
Starting parpool using the 'local' profile ... connected to 2 workers.
mypool =
Pool with properties:
AttachedFiles: {0x1 cell}
NumWorkers: 2
IdleTimeout: 30
Cluster: [1x1 parallel.cluster.Local]
RequestQueue: [1x1 parallel.RequestQueue]
SpmdEnabled: 1
opt = statset('UseParallel',true);
tic;B = bootstrp(200,myfun,x,'Options',opt);toc
Elapsed time is 6.304077 seconds.Параллельные вычисления почти в два раза быстрее, чем последовательные для этого примера.
Наложение ksdensity оценка плотности с 200 оценками начальной загрузки, полученными в параллельной начальной загрузке. Из этого графика можно получить представление о том, как оценить точность оценки плотности.
hold on
for i=1:size(B,1),
plot(latt,B(i,:),'c:')
end
plot(latt,pdfestimate);
xlabel('x');ylabel('Density estimate')
Для параллельного выполнения примера воспроизводимым способом установите соответствующие опции (см. Выполнение воспроизводимых параллельных вычислений). Сначала настройте проблему и параллельную среду, как в Bootstrap в Serial и Parallel. Затем задайте параметры для использования субпотоков вместе с потоком, поддерживающим субпотоки.
s = RandStream('mlfg6331_64'); % has substreams
opts = statset('UseParallel',true,...
'Streams',s,'UseSubstreams',true);
B2 = bootstrp(200,myfun,x,'Options',opts);Для повторного запуска начальной загрузки и получения того же результата:
reset(s) % set the stream to initial state
B3 = bootstrp(200,myfun,x,'Options',opts);
isequal(B2,B3) % check if same results
ans =
1