Запустите компоненты Co-симуляции на нескольких ядрах

Simulink® поддерживает co-симуляцию между компонентами с помощью локальных решателей, или это включает инструменты симуляции. Например, co-симуляция может включить S-функцию, реализованную как шлюз co-симуляции между Simulink и сторонними программами или пользовательским кодом. Это может также вовлечь FMU в режим co-симуляции, импортированный в Simulink.

Чтобы улучшать производительность, рассмотрите под управлением модели, которые содержат блоки co-симуляции (компоненты) на нескольких потоках если:

  • Вы интегрируете несколько компонентов co-симуляции

  • Интегрирование на уровне компонента в вычислительном отношении интенсивно

Эта тема принимает, что вы знакомы с многопоточным программированием и концепциями.

Simulink позволяет вам запустить S-функции MEX C и блоки Co-Simulation FMU на нескольких потоках, если они удовлетворяют этим требованиям:

  • Блок является непрямым сквозным соединением.

  • Блок ориентирован на многопотоковое исполнение, то есть, блок может работать с несколькими разделяемыми данными доступа потоков, ресурсы и объекты без любых конфликтов.

Примечание

Многопоточная co-симуляция для блоков Level-2 MATLAB S-Function не поддержана.

По умолчанию Simulink конфигурирует все модели, чтобы работать на нескольких потоках. Однако не все модели имеют компоненты co-симуляции, которые могут работать на нескольких потоках, и не всем преимуществе моделей от работы нескольких потоков. Чтобы видеть, имеет ли модель компоненты co-симуляции, которые могут извлечь выгоду из работы нескольких потоков, выполнить эти шаги:

  1. Откройте свою модель.

  2. Запустите инструмент Performance Advisor (на вкладке Debug, нажмите Performance Advisor).

  3. Выберите Simulation> Checks that Require Simulation to Run> Select multi-thread co-simulation setting on or off.

    Эта проверка проверяет, что модель или блок оптимально сконфигурированы, чтобы использовать в своих интересах многопоточную или однопоточную обработку. Если настройка не оптимальна, Performance Advisor показывает текущую установку и предупреждает вас, что модель не является хорошим кандидатом, чтобы работать на нескольких потоках.

  4. Осуществите выбранную проверку.

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

tic; sim('sfunction_components'); toc
Elapsed time is 2.323264 seconds.
get_param(gcs,'MultiThreadCoSim')
ans =
 'on'
set_param(gcs,'MultiThreadCoSim','off')
tic; sim('sfunction_components'); toc
Elapsed time is 4.112674 seconds.

Для примера рабочих компонентов co-симуляции на нескольких ядрах смотрите slexCoSimPrimeExample модель.

Используя MultiThreadCoSim Параметр

Можно указать, что целая модель работает на нескольких потоках или указывает, что конкретные блоки работают на нескольких потоках, с помощью MultiThreadCoSim параметр. Укажите, что целая модель работает на нескольких потоках, если все блоки co-симуляции в модели являются непрямым сквозным соединением и ориентированный на многопотоковое исполнение. Если некоторые, но не все блоки, являются непрямым сквозным соединением и ориентированный на многопотоковое исполнение, идентифицируют только те блоки, чтобы работать на нескольких потоках. Модель и блоки используют MultiThreadCoSim параметр можно следующим образом.

УстановкаМодельБлокОписание

'on'

 

Модель (По умолчанию) может работать на нескольких потоках.

'off'

Отключите блок или модель от работы нескольких потоков.

'auto'

 

(Значение по умолчанию) Позволило Simulink решить, может ли блок работать на нескольких потоках.

Включение MultiThreadCoSim параметр не означает, что блок или модель симулируют на нескольких потоках. Симуляция на нескольких потоках происходит когда MultiThreadCoSim включен и:

  • Блок и/или модель действуют на одном уровне.

  • Блок и/или модель ориентированы на многопотоковое исполнение. (Например, они не используют статические или глобальные данные).

  • Блок и/или модель являются непрямым сквозным соединением.

    • Для Блоков s-function используйте ssSetInputPortDirectFeedThrough функция.

    • Для блоков FMU оставьте dependencies припишите в файле описания модели FMU для ModelStructure/Outputs FMU и ModelStructure/InitialUnknowns поле как пустое. Этот атрибут должен быть (" ").

  • Блок и/или модель без исключений. Для Блоков s-function используйте ssSetOptions функционируйте, чтобы установить SS_OPTION_EXCEPTION_FREE_CODE.

Многопоточность не позволяет проверки сброса решателя, и поэтому перескакивает через любое использование ssSetSolverNeedsReset и ssBlockStateForSolverChangedAtMajorStep функции. С другой стороны, в режиме Accelerator, если эти функции используются или существуют непрерывные состояния, многопоточность автоматически выключена.

Конфигурирование блоков s-function, чтобы запуститься один или многопоточный

Запускается ли Блок s-function один, или многопоточный зависит от MultiThreadCoSim значение параметров и ssSetRuntimeThreadSafetyCompliance функция.

MultiThreadCoSim УстановкаssSetRuntimeThreadSafetyCompliance УстановкаОдин или мультипоток
'auto'RUNTIME_THREAD_SAFETY_COMPLIANCE_UNKNOWNОдин поток
'auto'RUNTIME_THREAD_SAFETY_COMPLIANCE_TRUEМультипоток
'auto'RUNTIME_THREAD_SAFETY_COMPLIANCE_FALSEОдин поток
'off'Установка проигнорирована и однопоточные запуски Блока s-function

Co-симуляция на нескольких ограничениях потоков

  • Симуляция работает на одном потоке для акселератора и быстрых режимов Accelerator.

  • Нет никакой генерации кода для компонентов co-симуляции.

  • Когда блок имеет эти настройки, он не поддерживает co-симуляцию:

Ограничения блока s-function

  • Должен иметь один уровень — ssSetSampleTime(SimStruct *S, int_T st_index, time_T period) должен быть назван, чтобы указать только один дискретный уровень.

  • Должен иметь фиксированный шаг расчета — В time_T ssSetSampleTime(SimStruct *S, int_T st_index, time_T period), period не может быть VARIABLE_SAMPLE_TIME.

  • Не может иметь непрерывных состояний — В ssSetNumContStates(SimStruct *S, int_T n)N должен быть 0.

  • Не должен иметь никаких прямых проходных портов — В ssSetInputPortDirectFeedThrough(SimStruct *S, int_T port, int_T dirFeed), dirFeed должен быть 0 для каждого входного порта.

  • Должно быть ориентировано на многопотоковое исполнение — В ssSetRuntimeThreadSafetyCompliance(SimStruct *S, int_T val), val должен быть RUNTIME_THREAD_SAFETY_COMPLIANCE_TRUE.

  • Должно быть без исключений — В ssSetOptions(SimStruct *S, uint_T options)Опции должен включать SS_OPTION_EXCEPTION_FREE_CODE.

Ограничения блока импорта FMU

  • Должен быть в режиме co-симуляции.

  • Должно быть ориентировано на многопотоковое исполнение, то есть, несколько FMUs не должны получать доступ к тому же файлу одновременно.

  • Логгирование отладки должно быть отключено — Например, set_param(block1,'FMUDebugLogging','on')

  • Перенаправление логгирования отладки установлено в Файл — Например, set_param(block1,'FMUDebugLoggingRedirect','File')

Ограничения блока Model

  • Не может осушить порты IRT для планирования.

  • Не может быть в для - каждая подсистема.

  • Должен быть в режиме Accelerator.

  • Должен иметь один уровень.

  • Не может использовать блоки с переменным шагом расчета.

  • Не может иметь непрерывных состояний.

  • Не может иметь прямого сквозного соединения ни на каком входном порте.

  • Должен иметь решатель фиксированного шага.

  • Не может получить доступ ни к каким хранилищам глобальных данных.

  • Не может использовать функции Simulink или блоки вызывающей стороны.

  • Не может содержать блоки To/From File.

Смотрите также

| | |

Похожие темы