Пользовательский интерфейс данных MATLAB Runtime

Эта функция позволяет данным быть совместно использованными экземпляром 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.

Предоставление кластерных профилей для приложений Parallel Computing Toolbox

Следующее является полным примером того, как можно использовать Пользовательский Интерфейс Данных MATLAB Runtime в качестве механизма, чтобы задать кластерный профиль для приложений Parallel Computing Toolbox.

Шаг 1: запишите свой код Parallel Computing Toolbox

  1. Скомпилируйте 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);
    
  2. Запустите код можно следующим образом после изменения профиля по умолчанию к local в случае необходимости.

    a = sample_pct(200)

  3. Проверьте, что вы получаете следующие результаты:

    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

Шаг 2: установите профиль Parallel Computing Toolbox

В порядке скомпилировать код 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

Шаг 3: скомпилируйте свою функцию

Можно скомпилировать функцию из командной строки путем ввода следующего:

mcc -W 'dotnet:netPctComp,NetPctClass' 
          init_sample_pct.m sample_pct.m -T link:lib

Поочередно, можно использовать приложение Library Compiler можно следующим образом:

  1. Выполните шаги в, Генерируют блок.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.

  2. Чтобы развернуть скомпилированное приложение, скопируйте папку for_redistribution_files_only, которая содержит следующее вашим конечным пользователям.

    Примечание

    Целевая машина конечного пользователя должна иметь доступ к кластеру.

Шаг 4: запишите приложение драйвера.NET

После добавляющих ссылок на ваш компонент и на 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);
            }
 
        }
    }
}

Вывод следующие: