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

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

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

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

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

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

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

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

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

Примечание

Многопоточное co-моделирование для Уровня 2 Блоки s-function MATLAB не поддержано.

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

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

  2. Запустите инструмент Performance Advisor (Анализ> Инструменты Производительности> Советник по вопросам Производительности).

  3. Выберите Simulation> Checks, которые Требуют, чтобы Моделирование Запустилось> Избранная установка co-моделирования мультипотока на или прочь.

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

  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 для поля FMU ModelStructure/Outputs и ModelStructure/InitialUnknowns как пустой. Этот атрибут должен быть (" ").

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

Конфигурирование блоков 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-моделирования.

  • Когда блок FMU имеет эти настройки, он не поддерживает 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), options должен включать SS_OPTION_EXCEPTION_FREE_CODE.

Блочные ограничения импорта FMU

  • Должен быть в режиме co-моделирования.

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

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

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

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

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

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

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

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

  • Не может использовать блоки с переменной частотой дискретизации.

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

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

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

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

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

  • Не может содержать К/От блокам Файла.

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

| | |

Похожие темы

Была ли эта тема полезной?