Распараллеливание, управление стековой, динамической памятью
-
- assistant
- Сообщения: 120
- Зарегистрирован: 05 сен 2019, 21:01
- Версия LabVIEW: 2019
- Контактная информация:
Распараллеливание, управление стековой, динамической памятью
Добрый вечер!
Можете подсказать, каким образом я могу предотвратить распараллеливание процессов на блок диаграмме либо задать последовательность процессов ? Также, как я могу управлять выделением стековой и динамической памяти, выделением ресурсов процессора ?
Где об этом можно почитать ?
Можете подсказать, каким образом я могу предотвратить распараллеливание процессов на блок диаграмме либо задать последовательность процессов ? Также, как я могу управлять выделением стековой и динамической памяти, выделением ресурсов процессора ?
Где об этом можно почитать ?
-
Kosist
- expert
- Сообщения: 1236
- Зарегистрирован: 21 фев 2011, 23:44
- Награды: 2
- Версия LabVIEW: 2013-2020
- Благодарил (а): 23 раза
- Поблагодарили: 30 раз
- Контактная информация:
Re: Распараллеливание, управление стековой, динамической пам
А зачем все это? LabVIEW было придумано специально для инженеров, которые не хотят, или не имеют времени/возможности учить языки программирования, и копаться во всем этом - но которым нужно чтобы приложение быстро и легко писалось без лишних заморочек, и делало то, что нужно: измеряло, анализировало данные, и т.д.
А все те действия, о которых Вы спрашивали - берет на себя LabVIEW компилятор, который достаточно умный и оптимизированный; и разработчику не нужно задумываться над динамической или стековой памятью, и чем-то в этом роде. Да, различные оптимизации нужно делать, но они немного на высшем уровне абстракции - как правильно работать с большими массивами, строками, и т.д. - но никто не работает с памятью "напрямую".
Какая у Вас задача? Для какого проекта нужны такие знания? Или это просто для общего развития?
А все те действия, о которых Вы спрашивали - берет на себя LabVIEW компилятор, который достаточно умный и оптимизированный; и разработчику не нужно задумываться над динамической или стековой памятью, и чем-то в этом роде. Да, различные оптимизации нужно делать, но они немного на высшем уровне абстракции - как правильно работать с большими массивами, строками, и т.д. - но никто не работает с памятью "напрямую".
Какая у Вас задача? Для какого проекта нужны такие знания? Или это просто для общего развития?
Мы делили апельсин - много наших полегло...
-
- assistant
- Сообщения: 120
- Зарегистрирован: 05 сен 2019, 21:01
- Версия LabVIEW: 2019
- Контактная информация:
Re: Распараллеливание, управление стековой, динамической пам
Пока для учебных целей. Мне нужно продемонстрировать выделение статической и динамической памяти в явном виде, и, найти пример такой, чтобы показать разницу в быстродействии (т.е. во времени исполнения). Где мне об этом найти информацию - т.к. в справочнике Суранова, например, не нашел.Kosist писал(а):А зачем все это? Какая у Вас задача? Для какого проекта нужны такие знания? Или это просто для общего развития?
-
- assistant
- Сообщения: 120
- Зарегистрирован: 05 сен 2019, 21:01
- Версия LabVIEW: 2019
- Контактная информация:
Re: Распараллеливание, управление стековой, динамической пам
Спасибо! Можете подсказать, как создать соответствующий CIN файл для этой цели на блок диаграмме ?Blackman писал(а):Memory Manager
https://zone.ni.com/reference/en-XX/hel ... y_manager/
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Распараллеливание, управление стековой, динамической пам
Совсем не обязательно писать CIN или DLL для того, чтобы вызвать функции Менеджера : Однако, вряд ли вам именно в таком ключе задачу поставили. Дело в том, что это функции низкого уровня и ими пользоваться приходится очень редко, и как правило при коммуникации с внешним кодом (DLL, .NET-сборки, ActiveX). Подавляющему большинству пользователей эти функции не нужны и даже не каждый о них знает. Как Kosist уже сказал, сам берёт на себя задачи выделения-свобождения памяти как в режиме разработки, так и в ран-тайме. Скорее, поставленная задача должна сводиться к демонстрации работы с распространёнными типами данных, как например кластер (статическая память) и массив (динамическая память).dakishi писал(а):Спасибо! Можете подсказать, как создать соответствующий CIN файл для этой цели на блок диаграмме ?
Последовательность выполнения потоков задаётся обычной Sequence-структурой или проводом (например, error in/out). Как вариант, можно сделать простую машину состояний.
Выделение ресурсов ЦП (ядер?) можно далеко не везде задать. Опять же, старается сам оптимально распределить нагрузку по ядрам. Буквально прописать конкретное ядро можно в Timed Loop.
-
- assistant
- Сообщения: 120
- Зарегистрирован: 05 сен 2019, 21:01
- Версия LabVIEW: 2019
- Контактная информация:
Re: Распараллеливание, управление стековой, динамической пам
Как я могу понять, что выделяется конкретно статическая или динамическая память под объект ? Ведь явно я её, динамическую, как например в С++, не выделяю, чтобы отличить от статической. Как можно измерить объем выделенной под объект памяти ?
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Распараллеливание, управление стековой, динамической пам
Все переменные, образующиеся в процессе запуска или работы , создаются в куче. Менеджер памяти, используемый в для множества операций, также берёт память из кучи. Без разницы, для статических или динамических объектов. Вообще, внутренняя кухня сильно отличается от таковой в традиционных средах программирования типа C/C++. Советую почитать статьи на этот счёт, например NI LabVIEW Compiler: Under the Hood. Вот здесь также коротко и понятным языком: http://labviewportal.org/viewtopic.php?p=48682#p48682dakishi писал(а):Как я могу понять, что выделяется конкретно стековая или динамическая память под объект ? Ведь явно я её, динамическую, как например в С++, не выделяю, чтобы отличить от стековой. Как можно измерить объем выделенной под объект памяти ?
По вашему вопросу:
https://forums.ni.com/t5/LabVIEW/Memory ... anguage=en
https://forums.ni.com/t5/LabVIEW/memory ... anguage=en
Последний вопрос не до конца понятен. Если, например, создаёте на БД массив типа I32 с размерностью 4 строки х 4 столбца, то получится 4*4*4=64 байта. Это под сами данные. Внутренне данные предваряются размером по каждому из измерений. Двумерный массив выглядит так:
Код: Выделить всё
typedef struct {
int32 dimSizes[2];
int32 elt[1];
} TD1;
typedef TD1 **TD1Hdl;
- Вложения
-
- 2019-09-08_17-52-24.jpg (4.38 КБ) 3248 просмотров
-
- assistant
- Сообщения: 120
- Зарегистрирован: 05 сен 2019, 21:01
- Версия LabVIEW: 2019
- Контактная информация:
Re: Распараллеливание, управление стековой, динамической пам
Спасибо за подробный ответ. Можете еще подсказать, где я могу найти менеджеры DSNewPtr, DSDisposePtr т.к. нигде не нашел, кроме как в мануале ?
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Распараллеливание, управление стековой, динамической пам
Это не менеджеры, это функции. А менеджер, содержащий функции для работы с памятью, называется Memory Manager. Выше я выкладывал сниппет, его можно сохранить на диск и перетащить на диаграмму. В общем случае нужно взять Call Library Function Node с палитры Connectivity -> Libraries & Executables, открыть настройки узла (Configure...), прописать Library name = LabVIEW и в поле Function name выбрать нужную функцию. Само собой, требуется указать параметры функции в том виде, как они представлены в описании. Другим вариантом может быть создание собственной библиотеки и вызов её из (понадобится подключить extcode.h из папки \[LabVIEW]\cintools).dakishi писал(а):Спасибо за подробный ответ. Можете еще подсказать, где я могу найти менеджеры DSNewPtr, DSDisposePtr т.к. нигде не нашел, кроме как в мануале ?
-
- assistant
- Сообщения: 120
- Зарегистрирован: 05 сен 2019, 21:01
- Версия LabVIEW: 2019
- Контактная информация:
Re: Распараллеливание, управление стековой, динамической пам
Если я создаю файл библиотеки, можно в CIN прописать static переменную, чтобы выделить стат память явно ? Или есть стандартные функции для этой цели в библиотеке LabVEW ?
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Распараллеливание, управление стековой, динамической пам
Просто объявляете статическую глобальную переменную вне функций:dakishi писал(а):Если я создаю файл библиотеки, можно в CIN прописать static переменную, чтобы выделить стат память явно ? Или есть стандартные функции для этой цели в библиотеке LabVEW ?
Код: Выделить всё
int x;
Код: Выделить всё
static int x;
Таким образом, тестировать будете среду, в которой библиотеку пишете, а не сам .
-
Vasiliy Baev
- leader
- Сообщения: 545
- Зарегистрирован: 31 окт 2011, 09:02
- Награды: 4
- Версия LabVIEW: 2019
- Откуда: Санкт-Петербург
- Благодарил (а): 9 раз
- Поблагодарили: 10 раз
- Контактная информация:
Re: Распараллеливание, управление стековой, динамической пам
Возможно данная ветка обсуждения будет Вам интереснаdakishi писал(а):Добрый вечер!
Также, как я могу управлять выделением стековой и динамической памяти.
Где об этом можно почитать ?
http://labviewportal.org/viewtopic.php?f=21&t=8971
-
- assistant
- Сообщения: 120
- Зарегистрирован: 05 сен 2019, 21:01
- Версия LabVIEW: 2019
- Контактная информация:
Ускорение процесса при выделении стековой памяти
Можете объяснить, почему выделение под процесс (подприбор) стековой памяти может ускорять его по сравнению с выделением под тот же процесс динамической памяти ? Либо, где можно почитать про это, чтобы разобраться ?
И где можно почитать в целом про структуру памяти ? Например, в С++ обычно выделяется отдельно память для констант и программного кода (младшие крайние разряды, на сколько помню, ОЗУ), статическая (младшие разряды), динамическая или куча(средние разряды), стековая (старшие разряды). Как дело обстоит в LabView ?
И где можно почитать в целом про структуру памяти ? Например, в С++ обычно выделяется отдельно память для констант и программного кода (младшие крайние разряды, на сколько помню, ОЗУ), статическая (младшие разряды), динамическая или куча(средние разряды), стековая (старшие разряды). Как дело обстоит в LabView ?
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Ускорение процесса при выделении стековой памяти
dakishi, зачем создали новую тему? Вопросы логически связаны с тематикой предыдущей темы.
Вот ещё: Is accessing data in the heap faster than from the stack?
Есть смысл обратиться на форумы по C/C++ или WinAPI или куда-то ещё. Здесь развёрнутый ответ вы вряд ли получите, т.к. LV-программерам редко приходится задумываться о таких низкоуровневых вещах.
+ ссылки, что я приводил в смежной теме
https://forums.ni.com/t5/LabVIEW/memory ... 9#M1054846
Как я уже писал ранее, для работы вся память выделяется в куче (heap). Хотя сам на Сях написан и очевидно использует все "плюшки" C++, включая работу со стеком, нативные классы, инлайн-операции и т.п. Хотите больше деталей - откройте отладчиком и смотрите. Ядро проприетарное и NI не описывают всех подробностей.
Быстрый гуглинг подсказывает:dakishi писал(а):Можете объяснить, почему выделение под процесс (подприбор) стековой памяти может ускорять его по сравнению с выделением под тот же процесс динамической памяти ? Либо, где можно почитать про это, чтобы разобраться ?
https://habr.com/ru/company/abbyy/blog/131713/Программы на C++ используют под локальные и временные переменные так называемую автоматическую память (automatic storage). Обычно автоматическая память реализована поверх стека программы, поэтому ее называют стековой. Ее большой плюс – выделение и освобождение памяти выполняется крайне быстро (обычно одна инструкция процессора). Ее большой минус – относительно небольшой объем, попытка выделить память сверх этого объема приводит к так называемому переполнению стека и тогда программа аварийно останавливается.
Вот ещё: Is accessing data in the heap faster than from the stack?
И см. далее по тексту. При желании очень много можно найти чтива на эту тему.That said, the virtual address of global data may be able to be calculated and hardcoded at compile time, the addresses of stack-based data are typically stack-pointer relative, while memory on the heap must almost always be accessed using pointers, which might be slightly slower on some systems - it depends on the CPU addressing modes and cycles, but it's almost always insignificant - not even worth a look or second thought unless you're writing something where millionths of a second are enormously important.
Есть смысл обратиться на форумы по C/C++ или WinAPI или куда-то ещё. Здесь развёрнутый ответ вы вряд ли получите, т.к. LV-программерам редко приходится задумываться о таких низкоуровневых вещах.
How LabVIEW Stores Data in Memorydakishi писал(а):И где можно почитать в целом про структуру памяти ? Например, в С++ обычно выделяется отдельно память для констант и программного кода (младшие крайние разряды, на сколько помню, ОЗУ), статическая (младшие разряды), динамическая или куча(средние разряды), стековая (старшие разряды). Как дело обстоит в LabView ?
+ ссылки, что я приводил в смежной теме
https://forums.ni.com/t5/LabVIEW/memory ... 9#M1054846
Как я уже писал ранее, для работы вся память выделяется в куче (heap). Хотя сам на Сях написан и очевидно использует все "плюшки" C++, включая работу со стеком, нативные классы, инлайн-операции и т.п. Хотите больше деталей - откройте отладчиком и смотрите. Ядро проприетарное и NI не описывают всех подробностей.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
- 3 Ответы
- 53 Просмотры
-
Последнее сообщение Artem.spb