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

Простейшие вопросы в области инженерной разработки

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

Postby dakishi on 05 Sep 2019, 21:09

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

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

Где об этом можно почитать ?
dakishi
interested
interested
 
Posts: 9
Joined: 05 Sep 2019, 21:01
LabVIEW Version: 2016
Karma: 0

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

Postby Kosist on 06 Sep 2019, 08:55

А зачем все это? LabVIEW было придумано специально для инженеров, которые не хотят, или не имеют времени/возможности учить языки программирования, и копаться во всем этом - но которым нужно чтобы приложение быстро и легко писалось без лишних заморочек, и делало то, что нужно: измеряло, анализировало данные, и т.д.
А все те действия, о которых Вы спрашивали - берет на себя LabVIEW компилятор, который достаточно умный и оптимизированный; и разработчику не нужно задумываться над динамической или стековой памятью, и чем-то в этом роде. Да, различные оптимизации нужно делать, но они немного на высшем уровне абстракции - как правильно работать с большими массивами, строками, и т.д. - но никто не работает с памятью "напрямую".
Какая у Вас задача? Для какого проекта нужны такие знания? Или это просто для общего развития?
Мы делили апельсин - много наших полегло...
User avatar
Kosist
leader
leader
 
Posts: 961
Joined: 21 Feb 2011, 23:44
Medals: 2
Activity (1) Gold (1)
LabVIEW Version: 2013-2017
Karma: 270
CLAD I/O VIP students

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

Postby dakishi on 06 Sep 2019, 09:07

Kosist wrote:А зачем все это? Какая у Вас задача? Для какого проекта нужны такие знания? Или это просто для общего развития?


Пока для учебных целей. Мне нужно продемонстрировать выделение статической и динамической памяти в явном виде, и, найти пример такой, чтобы показать разницу в быстродействии (т.е. во времени исполнения). Где мне об этом найти информацию - т.к. в справочнике Суранова, например, не нашел.
dakishi
interested
interested
 
Posts: 9
Joined: 05 Sep 2019, 21:01
LabVIEW Version: 2016
Karma: 0


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

Postby dakishi on 06 Sep 2019, 11:17



Спасибо! Можете подсказать, как создать соответствующий CIN файл для этой цели на блок диаграмме ?
dakishi
interested
interested
 
Posts: 9
Joined: 05 Sep 2019, 21:01
LabVIEW Version: 2016
Karma: 0

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

Postby dadreamer on 06 Sep 2019, 19:57

dakishi wrote:Спасибо! Можете подсказать, как создать соответствующий CIN файл для этой цели на блок диаграмме ?

Совсем не обязательно писать CIN или DLL для того, чтобы вызвать функции Менеджера :labview: :
Example_VI_BD.png
Example_VI_BD.png (8.67 KiB) Viewed 445 times

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

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

Выделение ресурсов ЦП (ядер?) можно далеко не везде задать. Опять же, :labview: старается сам оптимально распределить нагрузку по ядрам. Буквально прописать конкретное ядро можно в Timed Loop.
User avatar
dadreamer
professor
professor
 
Posts: 3303
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2019
Karma: 844
I/O VIP vision internet

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

Postby dakishi on 08 Sep 2019, 10:35

Как я могу понять, что выделяется конкретно статическая или динамическая память под объект ? Ведь явно я её, динамическую, как например в С++, не выделяю, чтобы отличить от статической. Как можно измерить объем выделенной под объект памяти ?
dakishi
interested
interested
 
Posts: 9
Joined: 05 Sep 2019, 21:01
LabVIEW Version: 2016
Karma: 0

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

Postby dadreamer on 08 Sep 2019, 15:50

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

Все переменные, образующиеся в процессе запуска или работы :vi: , создаются в куче. Менеджер памяти, используемый в :labview: для множества операций, также берёт память из кучи. Без разницы, для статических или динамических объектов. Вообще, внутренняя кухня :labview: сильно отличается от таковой в традиционных средах программирования типа C/C++. Советую почитать статьи на этот счёт, например NI LabVIEW Compiler: Under the Hood. Вот здесь также коротко и понятным языком: 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 байта. Это под сами данные. Внутренне данные предваряются размером по каждому из измерений. Двумерный массив выглядит так:
Code: Select all
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 KiB) Viewed 362 times
Но если речь о массиве, то намного проще взять Array Size.
Attachments
2019-09-08_17-52-24.jpg
2019-09-08_17-52-24.jpg (4.38 KiB) Viewed 361 times
User avatar
dadreamer
professor
professor
 
Posts: 3303
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2019
Karma: 844
I/O VIP vision internet

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

Postby dakishi on 08 Sep 2019, 18:37

Спасибо за подробный ответ. Можете еще подсказать, где я могу найти менеджеры DSNewPtr, DSDisposePtr т.к. нигде не нашел, кроме как в мануале ?
dakishi
interested
interested
 
Posts: 9
Joined: 05 Sep 2019, 21:01
LabVIEW Version: 2016
Karma: 0

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

Postby dadreamer on 08 Sep 2019, 22:03

dakishi wrote:Спасибо за подробный ответ. Можете еще подсказать, где я могу найти менеджеры 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).
User avatar
dadreamer
professor
professor
 
Posts: 3303
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2019
Karma: 844
I/O VIP vision internet

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

Postby dakishi on 10 Sep 2019, 19:34

Если я создаю файл библиотеки, можно в CIN прописать static переменную, чтобы выделить стат память явно ? Или есть стандартные функции для этой цели в библиотеке LabVEW ?
dakishi
interested
interested
 
Posts: 9
Joined: 05 Sep 2019, 21:01
LabVIEW Version: 2016
Karma: 0

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

Postby dadreamer on 10 Sep 2019, 20:39

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

Просто объявляете статическую глобальную переменную вне функций:
Code: Select all
int x;

или
Code: Select all
static int x;

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

Таким образом, тестировать будете среду, в которой библиотеку пишете, а не сам :labview: .
User avatar
dadreamer
professor
professor
 
Posts: 3303
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2019
Karma: 844
I/O VIP vision internet

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

Postby Vasiliy Baev on 11 Sep 2019, 09:54

dakishi wrote:Добрый вечер!
Также, как я могу управлять выделением стековой и динамической памяти.
Где об этом можно почитать ?


Возможно данная ветка обсуждения будет Вам интересна
http://labviewportal.ru/viewtopic.php?f=21&t=8971
User avatar
Vasiliy Baev
leader
leader
 
Posts: 508
Joined: 31 Oct 2011, 09:02
Location: Санкт-Петербург
Medals: 4
Activity (1) Gold (1) Bronze (2)
LabVIEW Version: 2013
Karma: 146
I/O VIP

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

Postby dakishi on 15 Sep 2019, 20:44

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

И где можно почитать в целом про структуру памяти ? Например, в С++ обычно выделяется отдельно память для констант и программного кода (младшие крайние разряды, на сколько помню, ОЗУ), статическая (младшие разряды), динамическая или куча(средние разряды), стековая (старшие разряды). Как дело обстоит в LabView ?
dakishi
interested
interested
 
Posts: 9
Joined: 05 Sep 2019, 21:01
LabVIEW Version: 2016
Karma: 0

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

Postby dadreamer on 16 Sep 2019, 09:35

dakishi, зачем создали новую тему? Вопросы логически связаны с тематикой предыдущей темы.

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

Быстрый гуглинг подсказывает:
Программы на 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 wrote:И где можно почитать в целом про структуру памяти ? Например, в С++ обычно выделяется отдельно память для констант и программного кода (младшие крайние разряды, на сколько помню, ОЗУ), статическая (младшие разряды), динамическая или куча(средние разряды), стековая (старшие разряды). Как дело обстоит в LabView ?

How LabVIEW Stores Data in Memory
+ ссылки, что я приводил в смежной теме
https://forums.ni.com/t5/LabVIEW/memory ... 9#M1054846
Как я уже писал ранее, для работы :vi: вся память выделяется в куче (heap). Хотя сам :labview: на Сях написан и очевидно использует все "плюшки" C++, включая работу со стеком, нативные классы, инлайн-операции и т.п. Хотите больше деталей - откройте :labview: отладчиком и смотрите. Ядро :labview: проприетарное и NI не описывают всех подробностей.
User avatar
dadreamer
professor
professor
 
Posts: 3303
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2019
Karma: 844
I/O VIP vision internet

Next

Return to Для чайников

Who is online

Users browsing this forum: Google, Yandex and 7 guests

cron