Эта функция позволяет совместно использовать данные между экземпляром MATLAB ® Runtime, кодом MATLAB, выполняющимся в этом экземпляре MATLAB Runtime, и кодом оболочки, который создал MATLAB Runtime. С помощью вызовов API интерфейса пользовательских данных среды выполнения MATLAB доступ к данным среды выполнения MATLAB осуществляется путем создания ассоциативного массива для каждого экземпляра. mxArrays, состоящий из отображения из строковых ключей в mxArray значения. Причины для этого включают, но не ограничиваются:
Необходимо предоставить информацию профиля среды выполнения MATLAB клиенту, выполняющему приложение, созданное с помощью программного обеспечения Parallel Computing Toolbox™. Профили могут предоставляться (и изменяться) на основе выполнения. Например, два экземпляра одного и того же приложения могут выполняться одновременно с разными профилями.
Необходимо инициализировать среду выполнения MATLAB с постоянными значениями, которые доступны для всех приложений MATLAB.
Необходимо настроить глобальную рабочую область - глобальную переменную или переменные, к которым MATLAB и клиент могут получить доступ.
Необходимо сохранить состояние любой переменной или группы переменных.
Программное обеспечение SDK™ компилятора MATLAB поддерживает доступ к состоянию экземпляра среды выполнения для каждого MATLAB через объектно-ориентированный API. Доступ к состоянию экземпляра необязателен. Вы можете получить доступ к этому состоянию, добавив setmcruserdata.m и getmcruserdata.m в проект развертывания или путем их указания в командной строке. Кроме того, для вызова этих методов можно использовать вспомогательную функцию, как показано в разделе Предоставление профилей кластера для приложений панели инструментов параллельных вычислений.
Дополнительные сведения см. в разделе Использование интерфейса пользовательских данных среды выполнения MATLAB.
Ниже приведен полный пример использования интерфейса пользовательских данных среды выполнения MATLAB в качестве механизма определения профиля кластера для приложений Parallel Computing Toolbox.
Собрать sample_pct.m в MATLAB.
В этом примере используется кластер, определенный в профиле по умолчанию.
В выходных данных предполагается, что профилем по умолчанию является local.
function speedup = sample_pct (n) warning off all; tic if(ischar(n)) n=str2double(n); end for ii = 1:n (cov(sin(magic(n)+rand(n,n)))); end time1 =toc; parpool; tic parfor ii = 1:n (cov(sin(magic(n)+rand(n,n)))); end time2 =toc; disp(['Normal loop times: ' num2str(time1) ... ',parallel loop time: ' num2str(time2) ]); disp(['parallel speedup: ' num2str(1/(time2/time1)) ... ' times faster than normal']); delete(gcp); disp('done'); speedup = (time1/time2);
Запустите код следующим образом после изменения профиля по умолчанию на local, при необходимости.
a = sample_pct(200)
Убедитесь, что получены следующие результаты:
Starting parallel pool (parpool) using the 'local' profile ... connected to 4 workers.
Normal loop times: 0.7587,parallel loop time: 2.9988
parallel speedup: 0.253 times faster than normal
Parallel pool using the 'local' profile is shutting down.
done
a =
0.2530Для компиляции кода MATLAB в компонент .NET и использования панели инструментов параллельных вычислений: mcruserdata должен быть установлен непосредственно из MATLAB. Нет API .NET, доступного для доступа к MCRUserdata как и для приложений C и C++, построенных с помощью MATLAB Compiler SDK.
Для установки mcruserdata из MATLAB создайте init в классе .NET. Это отдельная функция MATLAB, которая использует setmcruserdata для однократной установки профиля панели инструментов параллельных вычислений. Затем вы вызываете другие свои функции, чтобы использовать функции Parallel Computing Toolbox.
Создать следующее init функция:
function init_sample_pct
% Set the Parallel Profile:
if(isdeployed)
[profile] = uigetfile('*.settings');
% let the USER select file
setmcruserdata('ParallelProfile',
[profile]);
endМожно скомпилировать функцию из командной строки, введя следующее:
mcc -W 'dotnet:netPctComp,NetPctClass'
init_sample_pct.m sample_pct.m -T link:libВ качестве альтернативы можно использовать приложение компилятора библиотеки следующим образом:
Выполните действия, описанные в разделах Создание сборки .NET и Создание приложения .NET для компиляции приложения. По завершении компиляции создается новая папка (с тем же именем, что и у проекта). Эта папка содержит две подпапки: distrib и src.
| Название проекта | netPctComp |
| Имя класса | NetPctClass |
| Файл для компиляции | sample_pct.m и init_sample_pct.m |
Примечание
При использовании функции графического процессора панели инструментов Parallel Computing Toolbox необходимо вручную добавить файлы PTX и CU.
При использовании приложения компилятора библиотеки щелкните Добавить файлы/каталоги на вкладке Сборка.
При использовании mcc используйте команду -a вариант.
Чтобы развернуть скомпилированное приложение, скопируйте for_redistribution_files_only , которая содержит следующее, для конечных пользователей.
netPctComp.dll
MWArray.dll
Профиль кластера
Примечание
Конечный компьютер конечного пользователя должен иметь доступ к кластеру.
После добавления ссылок на компонент и MWArray в проекте Microsoft ® Visual Studio ® запишите следующее приложение драйвера .NET для использования компонента следующим образом. Дополнительные сведения см. в разделе Интеграция простой функции MATLAB.
Примечание
Этот пример кода был написан с помощью Microsoft Visual Studio 2008.
using System;
using MathWorks.MATLAB.NET.Utility;
using MathWorks.MATLAB.NET.Arrays;
using netPctComp;
namespace PctNet
{
class Program
{
static void Main(string[] args)
{
try
{
NetPctClass A = new NetPctClass();
// Initialize the PCT set up
A.init_sample_pct();
double var = 300;
MWNumericArray out1;
MWNumericArray in1 = new MWNumericArray(300);
out1 = (MWNumericArray)A.sample_pct(in1);
Console.WriteLine("The speedup is {0}", out1);
Console.ReadLine();
// Wait for user to exit application
}
catch (Exception exception)
{
Console.WriteLine("Error: {0}", exception);
}
}
}
}Выходные данные следующие:
