Построение parallel.pool.Constant из дескриптора данных или функции
C = parallel.pool.Constant(X)
C = parallel.pool.Constant(FH)
C = parallel.pool.Constant(FH,CLEANUP)
C = parallel.pool.Constant(COMP)
C = parallel.pool.Constant(X) копирует значение X каждому работнику и возвращает объект parallel.pool.Constant, C, что позволяет каждому работнику получить доступ к значению X в параллельной языковой конструкции (parfor, spmd, parfeval) с использованием свойства C.Value. Это может повысить производительность при наличии нескольких циклов parfor-loops для доступа к одному и тому же постоянному набору данных, поскольку X передается работникам только один раз.
C = parallel.pool.Constant(FH) оценивает дескриптор функции FH на каждом работнике и сохраняет результат в C.Value. Это также полезно для создания и использования любых ресурсов типа дескриптора на рабочих, таких как дескрипторы файлов и подключения к базе данных.
C = parallel.pool.Constant(FH,CLEANUP) оценивает дескриптор функции FH на каждом работнике и сохраняет результат в C.Value. Когда C очищен, дескриптор функции CLEANUP вычисляется с помощью одного аргумента C.Value на каждом работнике.
C = parallel.pool.Constant(COMP) использует значения, сохраненные в Composite COMPи сохраняет их в C.Value на каждом работнике. Это особенно полезно, когда данные, которые необходимо использовать внутри цикла parfor, могут быть созданы только на рабочих, например, когда данные слишком велики для удобного размещения в клиенте или когда они загружаются из файла, к которому могут получить доступ только рабочие. Если COMP не имеет определенного значения для каждого работника, результатом является ошибка.
parallel.pool.Constant должен вызываться в клиентском сеансе MATLAB.
Вы можете использовать parallel.pool.Constant с уже запущенным параллельным пулом или последующими параллельными пулами.
В этом примере показано, как создать числовой parallel.pool.Constant и использовать его в нескольких parfor-закольцовывает в одном пуле.
Сначала создайте большие данные на клиенте, затем создайте parallel.pool.Constant, передав данные в пул только один раз.
data = rand(1000); c = parallel.pool.Constant(data); for ii = 1:10 % Run multiple PARFOR loops accessing the data. parfor jj = 1:10 x(ii,jj) = c.Value(ii,jj); end end
В этом примере показано, как создать parallel.pool.Constant с дескриптором функции и функцией очистки.
Создайте временный файл для каждого работника. Проходя @fclose в качестве второго аргумента файл автоматически закрывается, когда c выходит за рамки.
c = parallel.pool.Constant(@() fopen(tempname(pwd),'wt'),@fclose); spmd disp(fopen(c.Value)); % Displays the temporary filenames. end parfor idx = 1:1000 fprintf(c.Value,'Iteration: %d\n',idx); end clear c; % Closes the temporary files.
В этом примере показано, как создавать большие наборы данных как составные для работников пула внутри spmd блок, а затем использовать эти данные как parallel.pool.Constant внутри parfor-луп.
spmd if labindex == 1 x = labBroadcast(1,rand(5000)); else x = labBroadcast(1); end end xc = parallel.pool.Constant(x); parfor idx = 1:10 s(idx) = sum(xc.Value(:,idx)); end s
s =
1.0e+03 *
2.5108 2.5031 2.5123 2.4909 2.4957 2.5462 2.4859 2.5320 2.5076 2.5432parcluster | parfeval | parfor | parpool | spmd