Вот пример, синхронизирующий начальную загрузку параллельно по сравнению с в сериале. Пример генерирует данные из смеси двух Gaussians, создает непараметрическую оценку получившихся данных и использует начальную загрузку, чтобы получить смысл изменчивости выборки.
Сгенерируйте данные:
% 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')
Чтобы запустить пример параллельно восстанавливаемым способом, установите опции соответственно (см. Рабочие Восстанавливаемые Параллельные Вычисления). Сначала настройте проблему и найдите что-либо подобное среде как в Начальной загрузке в Последовательном и Параллельном. Затем установите опции использовать подпотоки наряду с потоком, который поддерживает подпотоки.
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