Реализуйте начальную загрузку Используя параллельные вычисления

Загрузитесь в последовательном и параллельном

Вот пример, синхронизирующий начальную загрузку параллельно по сравнению с в сериале. Пример генерирует данные из смеси двух Gaussians, создает непараметрическую оценку получившихся данных и использует начальную загрузку, чтобы получить смысл изменчивости выборки.

  1. Сгенерируйте данные:

    % Generate a random sample of size 1000,
    % from a mixture of two Gaussian distributions 
    x = [randn(700,1); 4 + 2*randn(300,1)];
  2. Создайте непараметрическую оценку плотности от данных:

    latt = -4:0.01:12;
    myfun = @(X) ksdensity(X,latt); 
    pdfestimate = myfun(x);
  3. Загрузите оценку, чтобы получить смысл ее изменчивости выборки. Запустите начальную загрузку в сериале для синхронизации сравнения.

    tic;B = bootstrp(200,myfun,x);toc
    
    Elapsed time is 10.878654 seconds.
  4. Запустите начальную загрузку параллельно для синхронизации сравнения:

    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