Эта функция позволяет данным быть совместно использованными экземпляром MATLAB® Runtime, код MATLAB, работающий, что экземпляр MATLAB Runtime и код обертки, который создал MATLAB Runtime. Через вызовы API интерфейса MATLAB Runtime User Data вы получаете доступ к данным MATLAB Runtime путем создания ассоциативного массива на экземпляр mxArray
s, состоя из отображения от строковых ключей до значений mxArray
. Причины того, чтобы сделать это включают, но не ограничиваются:
Необходимо предоставить информацию профиля MATLAB Runtime клиенту, запускающему приложение, созданное с программным обеспечением Parallel Computing Toolbox™. Профили могут быть предоставлены (и изменены) на основе на выполнение. Например, два экземпляра того же приложения могут запуститься одновременно с различными профилями.
Вы хотите инициализировать MATLAB Runtime с постоянными значениями, к которым могут получить доступ все ваши приложения MATLAB.
Вы хотите настроить глобальную рабочую область — глобальная переменная или переменные, к которым могут получить доступ MATLAB и ваш клиент.
Вы хотите сохранить состояние любой переменной или группу переменных.
Программное обеспечение MATLAB Compiler SDK™ поддерживает доступ к состоянию экземпляра НА MATLAB RUNTIME через объектно-ориентированный API. Доступ к состоянию на экземпляр является дополнительным. Можно получить доступ к этому состоянию путем добавления setmcruserdata.m
и getmcruserdata.m
к проекту развертывания или путем определения их на командной строке. Также можно использовать функцию помощника, чтобы вызвать эти методы как показано в Предоставлении Кластерных Профилей для Приложений Parallel Computing Toolbox.
Для получения дополнительной информации смотрите Используя Пользовательский Интерфейс Данных MATLAB Runtime.
Следующее является полным примером того, как можно использовать Пользовательский Интерфейс Данных MATLAB Runtime в качестве механизма, чтобы задать кластерный профиль для приложений 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 и использовать Parallel Computing Toolbox, mcruserdata
должен быть установлен непосредственно из MATLAB. Нет никакого API.NET, доступного, чтобы получить доступ к MCRUserdata
, когда существует для C и приложений C++, созданных с MATLAB Compiler SDK.
Чтобы установить mcruserdata
из MATLAB, создайте функцию init
в своем классе.NET. Это - отдельная функция MATLAB, которая использует setmcruserdata
, чтобы установить профиль Parallel Computing Toolbox однажды. Вы затем вызываете свои другие функции, чтобы использовать функции 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
Поочередно, можно использовать приложение Library Compiler можно следующим образом:
Выполните шаги в, Генерируют блок.NET и Создают Приложение.NET, чтобы скомпилировать ваше приложение. Когда компиляция заканчивается, новая папка (с тем же именем как проект) создается. Эта папка содержит две подпапки: distrib
и src
.
Название проекта | netPctComp |
ClassName | NetPctClass |
Файл, чтобы скомпилировать | sample_pct.m и init_sample_pct.m |
Если вы используете функцию графического процессора Parallel Computing Toolbox, необходимо вручную добавить файлы CU и PTX.
Если вы используете приложение Library Compiler, нажмите Add files/directories на вкладке Build.
Если вы используете команду mcc
, используйте опцию -a
.
Чтобы развернуть скомпилированное приложение, скопируйте папку for_redistribution_files_only
, которая содержит следующее вашим конечным пользователям.
netPctComp.dll
MWArray.dll
Кластерный профиль
Целевая машина конечного пользователя должна иметь доступ к кластеру.
После добавляющих ссылок на ваш компонент и на MWArray
в вашем проекте Microsoft® Visual Studio®, запишите следующее приложение драйвера.NET, чтобы использовать компонент, можно следующим образом. Смотрите Интеграцию Простого MATLAB Functionfor больше информации.
Этот пример кода был записан с помощью 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); } } } }
Вывод следующие: