Распараллеливание, управление стековой, динамической памятью

Простейшие вопросы в области инженерной разработки
dakishi
assistant
assistant
Сообщения: 120
Зарегистрирован: 05 сен 2019, 21:01
Версия LabVIEW: 2019
Контактная информация:

Распараллеливание, управление стековой, динамической памятью

Сообщение dakishi »

Добрый вечер!

Можете подсказать, каким образом я могу предотвратить распараллеливание процессов на блок диаграмме либо задать последовательность процессов ? Также, как я могу управлять выделением стековой и динамической памяти, выделением ресурсов процессора ?

Где об этом можно почитать ?
Аватара пользователя
Kosist

Activity Gold
expert
expert
Сообщения: 1236
Зарегистрирован: 21 фев 2011, 23:44
Награды: 2
Версия LabVIEW: 2013-2020
Благодарил (а): 23 раза
Поблагодарили: 30 раз
Контактная информация:

Re: Распараллеливание, управление стековой, динамической пам

Сообщение Kosist »

А зачем все это? LabVIEW было придумано специально для инженеров, которые не хотят, или не имеют времени/возможности учить языки программирования, и копаться во всем этом - но которым нужно чтобы приложение быстро и легко писалось без лишних заморочек, и делало то, что нужно: измеряло, анализировало данные, и т.д.
А все те действия, о которых Вы спрашивали - берет на себя LabVIEW компилятор, который достаточно умный и оптимизированный; и разработчику не нужно задумываться над динамической или стековой памятью, и чем-то в этом роде. Да, различные оптимизации нужно делать, но они немного на высшем уровне абстракции - как правильно работать с большими массивами, строками, и т.д. - но никто не работает с памятью "напрямую".
Какая у Вас задача? Для какого проекта нужны такие знания? Или это просто для общего развития?
Мы делили апельсин - много наших полегло...
dakishi
assistant
assistant
Сообщения: 120
Зарегистрирован: 05 сен 2019, 21:01
Версия LabVIEW: 2019
Контактная информация:

Re: Распараллеливание, управление стековой, динамической пам

Сообщение dakishi »

Kosist писал(а):А зачем все это? Какая у Вас задача? Для какого проекта нужны такие знания? Или это просто для общего развития?
Пока для учебных целей. Мне нужно продемонстрировать выделение статической и динамической памяти в явном виде, и, найти пример такой, чтобы показать разницу в быстродействии (т.е. во времени исполнения). Где мне об этом найти информацию - т.к. в справочнике Суранова, например, не нашел.
Blackman

Activity
leader
leader
Сообщения: 932
Зарегистрирован: 17 янв 2016, 15:02
Награды: 1
Версия LabVIEW: 6.1,8.5,20

Re: Распараллеливание, управление стековой, динамической пам

Сообщение Blackman »

dakishi
assistant
assistant
Сообщения: 120
Зарегистрирован: 05 сен 2019, 21:01
Версия LabVIEW: 2019
Контактная информация:

Re: Распараллеливание, управление стековой, динамической пам

Сообщение dakishi »

Blackman писал(а):Memory Manager
https://zone.ni.com/reference/en-XX/hel ... y_manager/
Спасибо! Можете подсказать, как создать соответствующий CIN файл для этой цели на блок диаграмме ?
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Распараллеливание, управление стековой, динамической пам

Сообщение dadreamer »

dakishi писал(а):Спасибо! Можете подсказать, как создать соответствующий CIN файл для этой цели на блок диаграмме ?
Совсем не обязательно писать CIN или DLL для того, чтобы вызвать функции Менеджера :labview: :
Example_VI_BD.png
Example_VI_BD.png (8.67 КБ) 3237 просмотров
Однако, вряд ли вам именно в таком ключе задачу поставили. Дело в том, что это функции низкого уровня и ими пользоваться приходится очень редко, и как правило при коммуникации с внешним кодом (DLL, .NET-сборки, ActiveX). Подавляющему большинству пользователей :labview: эти функции не нужны и даже не каждый о них знает. Как Kosist уже сказал, :labview: сам берёт на себя задачи выделения-свобождения памяти как в режиме разработки, так и в ран-тайме. Скорее, поставленная задача должна сводиться к демонстрации работы с распространёнными типами данных, как например кластер (статическая память) и массив (динамическая память).

Последовательность выполнения потоков задаётся обычной Sequence-структурой или проводом (например, error in/out). Как вариант, можно сделать простую машину состояний.

Выделение ресурсов ЦП (ядер?) можно далеко не везде задать. Опять же, :labview: старается сам оптимально распределить нагрузку по ядрам. Буквально прописать конкретное ядро можно в Timed Loop.
dakishi
assistant
assistant
Сообщения: 120
Зарегистрирован: 05 сен 2019, 21:01
Версия LabVIEW: 2019
Контактная информация:

Re: Распараллеливание, управление стековой, динамической пам

Сообщение dakishi »

Как я могу понять, что выделяется конкретно статическая или динамическая память под объект ? Ведь явно я её, динамическую, как например в С++, не выделяю, чтобы отличить от статической. Как можно измерить объем выделенной под объект памяти ?
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Распараллеливание, управление стековой, динамической пам

Сообщение dadreamer »

dakishi писал(а):Как я могу понять, что выделяется конкретно стековая или динамическая память под объект ? Ведь явно я её, динамическую, как например в С++, не выделяю, чтобы отличить от стековой. Как можно измерить объем выделенной под объект памяти ?
Все переменные, образующиеся в процессе запуска или работы :vi: , создаются в куче. Менеджер памяти, используемый в :labview: для множества операций, также берёт память из кучи. Без разницы, для статических или динамических объектов. Вообще, внутренняя кухня :labview: сильно отличается от таковой в традиционных средах программирования типа C/C++. Советую почитать статьи на этот счёт, например NI LabVIEW Compiler: Under the Hood. Вот здесь также коротко и понятным языком: http://labviewportal.org/viewtopic.php?p=48682#p48682
По вашему вопросу:
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-49-04.jpg
2019-09-08_17-49-04.jpg (38.69 КБ) 3154 просмотра
Но если речь о массиве, то намного проще взять Array Size.
Вложения
2019-09-08_17-52-24.jpg
2019-09-08_17-52-24.jpg (4.38 КБ) 3153 просмотра
dakishi
assistant
assistant
Сообщения: 120
Зарегистрирован: 05 сен 2019, 21:01
Версия LabVIEW: 2019
Контактная информация:

Re: Распараллеливание, управление стековой, динамической пам

Сообщение dakishi »

Спасибо за подробный ответ. Можете еще подсказать, где я могу найти менеджеры DSNewPtr, DSDisposePtr т.к. нигде не нашел, кроме как в мануале ?
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Распараллеливание, управление стековой, динамической пам

Сообщение dadreamer »

dakishi писал(а):Спасибо за подробный ответ. Можете еще подсказать, где я могу найти менеджеры DSNewPtr, DSDisposePtr т.к. нигде не нашел, кроме как в мануале ?
Это не менеджеры, это функции. А менеджер, содержащий функции для работы с памятью, называется Memory Manager. Выше я выкладывал сниппет, его можно сохранить на диск и перетащить на диаграмму. В общем случае нужно взять Call Library Function Node с палитры Connectivity -> Libraries & Executables, открыть настройки узла (Configure...), прописать Library name = LabVIEW и в поле Function name выбрать нужную функцию. Само собой, требуется указать параметры функции в том виде, как они представлены в описании.
2019-09-09_0-00-52.jpg
Другим вариантом может быть создание собственной библиотеки и вызов её из :labview: (понадобится подключить extcode.h из папки \[LabVIEW]\cintools).
dakishi
assistant
assistant
Сообщения: 120
Зарегистрирован: 05 сен 2019, 21:01
Версия LabVIEW: 2019
Контактная информация:

Re: Распараллеливание, управление стековой, динамической пам

Сообщение dakishi »

Если я создаю файл библиотеки, можно в CIN прописать static переменную, чтобы выделить стат память явно ? Или есть стандартные функции для этой цели в библиотеке LabVEW ?
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Распараллеливание, управление стековой, динамической пам

Сообщение dadreamer »

dakishi писал(а):Если я создаю файл библиотеки, можно в CIN прописать static переменную, чтобы выделить стат память явно ? Или есть стандартные функции для этой цели в библиотеке LabVEW ?
Просто объявляете статическую глобальную переменную вне функций: или

Код: Выделить всё

static int x;
Произвольный блок памяти можно выделить через _alloca. Ну, это уже специфика C, к :labview: не имеющая отношения. Каких-то особых функций в memory manager'е нет, кроме того, что описано в мануале.

Таким образом, тестировать будете среду, в которой библиотеку пишете, а не сам :labview: .
Аватара пользователя
Vasiliy Baev

Activity Gold Bronze
leader
leader
Сообщения: 545
Зарегистрирован: 31 окт 2011, 09:02
Награды: 4
Версия LabVIEW: 2019
Откуда: Санкт-Петербург
Благодарил (а): 8 раз
Поблагодарили: 10 раз
Контактная информация:

Re: Распараллеливание, управление стековой, динамической пам

Сообщение Vasiliy Baev »

dakishi писал(а):Добрый вечер!
Также, как я могу управлять выделением стековой и динамической памяти.
Где об этом можно почитать ?
Возможно данная ветка обсуждения будет Вам интересна
http://labviewportal.org/viewtopic.php?f=21&t=8971
dakishi
assistant
assistant
Сообщения: 120
Зарегистрирован: 05 сен 2019, 21:01
Версия LabVIEW: 2019
Контактная информация:

Ускорение процесса при выделении стековой памяти

Сообщение dakishi »

Можете объяснить, почему выделение под процесс (подприбор) стековой памяти может ускорять его по сравнению с выделением под тот же процесс динамической памяти ? Либо, где можно почитать про это, чтобы разобраться ?

И где можно почитать в целом про структуру памяти ? Например, в С++ обычно выделяется отдельно память для констант и программного кода (младшие крайние разряды, на сколько помню, ОЗУ), статическая (младшие разряды), динамическая или куча(средние разряды), стековая (старшие разряды). Как дело обстоит в LabView ?
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Ускорение процесса при выделении стековой памяти

Сообщение dadreamer »

dakishi, зачем создали новую тему? Вопросы логически связаны с тематикой предыдущей темы.
dakishi писал(а):Можете объяснить, почему выделение под процесс (подприбор) стековой памяти может ускорять его по сравнению с выделением под тот же процесс динамической памяти ? Либо, где можно почитать про это, чтобы разобраться ?
Быстрый гуглинг подсказывает:
Программы на C++ используют под локальные и временные переменные так называемую автоматическую память (automatic storage). Обычно автоматическая память реализована поверх стека программы, поэтому ее называют стековой. Ее большой плюс – выделение и освобождение памяти выполняется крайне быстро (обычно одна инструкция процессора). Ее большой минус – относительно небольшой объем, попытка выделить память сверх этого объема приводит к так называемому переполнению стека и тогда программа аварийно останавливается.
https://habr.com/ru/company/abbyy/blog/131713/
Вот ещё: 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-программерам редко приходится задумываться о таких низкоуровневых вещах.
dakishi писал(а):И где можно почитать в целом про структуру памяти ? Например, в С++ обычно выделяется отдельно память для констант и программного кода (младшие крайние разряды, на сколько помню, ОЗУ), статическая (младшие разряды), динамическая или куча(средние разряды), стековая (старшие разряды). Как дело обстоит в LabView ?
How LabVIEW Stores Data in Memory
+ ссылки, что я приводил в смежной теме
https://forums.ni.com/t5/LabVIEW/memory ... 9#M1054846
Как я уже писал ранее, для работы :vi: вся память выделяется в куче (heap). Хотя сам :labview: на Сях написан и очевидно использует все "плюшки" C++, включая работу со стеком, нативные классы, инлайн-операции и т.п. Хотите больше деталей - откройте :labview: отладчиком и смотрите. Ядро :labview: проприетарное и NI не описывают всех подробностей.
Ответить

Вернуться в «Для чайников»