exponenta event banner

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

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

Шаг 1: Напишите код набора инструментов для параллельных вычислений

  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: Настройка профиля панели инструментов параллельных вычислений

Для компиляции кода 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

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

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

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

В качестве альтернативы можно использовать приложение компилятора библиотеки следующим образом:

  1. Выполните действия, описанные в разделах Создание сборки .NET и Создание приложения .NET для компиляции приложения. По завершении компиляции создается новая папка (с тем же именем, что и у проекта). Эта папка содержит две подпапки: distrib и src.

    Название проектаnetPctComp
    Имя классаNetPctClass
    Файл для компиляции sample_pct.m и init_sample_pct.m

    Примечание

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

    При использовании приложения компилятора библиотеки щелкните Добавить файлы/каталоги на вкладке Сборка.

    При использовании mcc используйте команду -a вариант.

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

    Примечание

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

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

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

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