Reszta instrukcji przebiega tak samo dla obu wersji Matlaba.
primeNumbers = primes(uint64(2^21));
compositeNumbers = primeNumbers.*primeNumbers(randperm(numel(primeNumbers)));
factors = zeros(numel(primeNumbers),2);
tic;
for idx = 1:numel(compositeNumbers)
factors(idx,:) = factor(compositeNumbers(idx));
end
toc
Skrypt stworzy 2^21 liczb pierwszych, które zostaną zapisane w zmiennej factors. Jest to dość czasochłonne zadanie (około 20 minut), więc jeśli chcemy skrócić jego działanie, wystarczy, że zmniejszymy potęgę w pierwszej linijce kodu.
% wybierze domyślny profil klastra
cluster = parcluster;
% specyfikujemy liczbę rdzeni na których chcemy wykonać zadanie
cluster.NumThreads = 4;
% możemy także wyspecyfikować maksymalną liczbę workerów parametrem poniżej
cluster.NumWorkers = 4;
% wpisujemy nazwę skryptu BEZ dopisku ".m", parametr /'Pool' ,x/
% parametr /'Pool' ,x/ mówi o liczbie wykorzystanych workerów do zadania
% maksymalna liczba jest zawsze o 1 niższa od liczby z parametru wyżej.
job = batch(cluster, "test", 'Pool', 3);
Dla większej liczby argumentów dla funkcji batch() można zajrzeć pod ten link.
Tak wysłane zadanie możemy monitorować przez opcję monitor jobs z dodatku Parallel w zakładce głównej HOME
Przykładowe okno monitoringu wysłanych zadań na klaster.
Teraz dokonajmy edycji kodu tak, aby użyć lepiej zasobów klastra, a mianowicie dodajmy pętl parfor, do tego zmniejszamy liczbę liczb pierwszych generowanych przez skrypt, aby nie czekać za długo na wynik.
primeNumbers = primes(uint64(2^19));
compositeNumbers = primeNumbers.*primeNumbers(randperm(numel(primeNumbers)));
factors = zeros(numel(primeNumbers),2);
numWorkers = [1 2 4 6];
tLocal = zeros(size(numWorkers));
for w = 1:numel(numWorkers)
tic;
parfor (idx = 1:numel(compositeNumbers), numWorkers(w))
factors(idx,:) = factor(compositeNumbers(idx));
end
tLocal(w) = toc;
end
load(job, "tLocal"); %ściąga wyniki zapisane w konkretnej zmiennej.
fetchOutputs(job); %ściąga wszystkie wyniki.
Po pobraniu zmiennej wynikowej mamy kolejne wyniki czasu dla kolejnych wartości workerów wykonującyh pętlę parfor.
f = figure;
speedup = tLocal(1)./tLocal;
plot(numWorkers, speedup);
title('Speedup with the number of workers');
xlabel('Number of workers');
xticks(numWorkers);
ylabel('Speedup');
Skrypt ten powinien nam pokazać wykres zależności prędkości przetwarzania danych od liczby workerów przydzielonych do pętli parfor.