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

Эта функция позволяет совместно использовать данные между MATLAB® Образец среды выполнения, код MATLAB, выполняемый на этом образце MATLAB Runtime, и код оболочки, который создал MATLAB Runtime. Посредством вызовов API интерфейса пользовательских данных MATLAB Runtime, вы получаете доступ к данным MATLAB Runtime путем создания ассоциативного массива mxArray по экземплярамs, состоящий из отображения из строковых ключей в mxArray значения. Причины для этого включают, но не ограничиваются:

  • Вы должны предоставить информацию о профиле MATLAB Runtime клиенту, выполняющему приложение, созданное с помощью программного обеспечения Parallel Computing Toolbox™. Профили могут поставляться (и изменяться) по базису выполнения. Например, два образцов одного и того же приложения могут запускаться одновременно с различными профилями.

  • Вы хотите инициализировать MATLAB Runtime с постоянными значениями, которые могут быть доступны всем вашим приложениям MATLAB.

  • Вы хотите настроить глобальную рабочую область - глобальную переменную или переменные, к которым могут получить доступ MATLAB и ваш клиент.

  • Вы хотите сохранить состояние любой переменной или группы переменных.

MATLAB Compiler SDK™ поддерживает доступ к образцу по MATLAB во время выполнения через объектно-ориентированный 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. Для доступа к MCRUserdata отсутствует API .NET как и для приложений 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
    Имя классаNetPctClass
    Файл для компиляции sample_pct.m и init_sample_pct.m

    Примечание

    Если вы используете функцию GPU Parallel Computing Toolbox, необходимо вручную добавить файлы PTX и CU.

    Если вы используете приложение Library Compiler, нажмите Add files/directories на вкладке Build.

    Если вы используете mcc команда, используйте -a опция.

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

    • netPctComp.dll

    • MWArray.dll

    • MATLAB Runtime

    • Профиль кластера

    Примечание

    Конечный компьютер конечного пользователя должен иметь доступ к кластеру.

Шаг 4: Запись приложения драйвера .NET

После добавления ссылок на ваш компонент и на MWArray в вашей корпорации Майкрософт® Визуальная студия® напишите следующее приложение драйвера .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);
            }
 
        }
    }
}

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