Организация параллельных вычислений в цикле

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

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
professor
professor
Сообщения: 4930
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Репутация: 0
Версия LabVIEW: 2015, 2016
Откуда: СССР

Организация параллельных вычислений в цикле

Сообщение IvanLis »

Организация параллельных вычислений в цикле

Как говорится "век живи, век учись".... :D
Никогда раньше не задавался целью разобраться с подобным вопросом, но видимо время пришло.

И сразу возник ряд вопросов.
Сделал небольшой пример, так как не привык верить наслово:
TimeTest.vi
lv2010
(327.43 КБ) 101 скачивание

так что каждый желающий может попробовать.

По логике, прирост должен быть в случае наличия нескольких ядер процессора.
При чем, если выполнять разбиение на количество параллельных процессов равное количеству ядер на борту, быстродействие должно быть максимальным.
Но получается не совсем так:
это на одноядерном процессоре
это на одноядерном процессоре
1Core.png (1.34 КБ) 3523 просмотра

это на 2-х ядерном
это на 2-х ядерном
2Core.png (1.29 КБ) 3523 просмотра

Получается совсем не логично, т.е. в один поток выполняется медленнее чем в два.
Если при 2-х ядрах это понятно, то для одного нет.
Если предположить, что в два потока процессор загружается более плотно, нежели в один и за счет этого имеем выигрыш. То почему этого не происходит на четырех потоках или на 2-х ядерном и четырех потоках?


Еще не понятно, если необходимо изменить количество потоков в зависимости от конфигурации или ситуации, как это сделать. Т.е. этот вариант не прокатывает, вообще ничего не считается:
Снимок.png
Снимок.png (2.57 КБ) 3523 просмотра

получается только так сконфигурировать:
Снимок-1.png


--------------
1. Кто-нибудь может объяснить в чем дело.
2. Не имею доступа к 4-х ядерному компу, хотелось бы посмотреть результаты прогонов.

Аватара пользователя
Sergey Ivanov

Activity Professionalism Gold Автор
expert
expert
Сообщения: 1193
Зарегистрирован: 01 мар 2009, 20:54
Награды: 5
Репутация: 0
Версия LabVIEW: 2013
Откуда: Санкт-Петербург, Кронштадт
Контактная информация:

Re: Организация параллельных вычислений в цикле

Сообщение Sergey Ivanov »

завтра на работе. у нас типа 8 ядер. попробую что получится
Добро пожаловать на http://rk-stud.ru/

Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
professor
professor
Сообщения: 4930
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Репутация: 0
Версия LabVIEW: 2015, 2016
Откуда: СССР

Re: Организация параллельных вычислений в цикле

Сообщение IvanLis »

Sergey Ivanov писал(а):завтра на работе. у нас типа 8 ядер. попробую что получится


по ряду причин меня больше всего интересует 4-х ядерный процессор

но интересно будет все
а то возможность есть, а применения нет

Аватара пользователя
Sergey Ivanov

Activity Professionalism Gold Автор
expert
expert
Сообщения: 1193
Зарегистрирован: 01 мар 2009, 20:54
Награды: 5
Репутация: 0
Версия LabVIEW: 2013
Откуда: Санкт-Петербург, Кронштадт
Контактная информация:

Re: Организация параллельных вычислений в цикле

Сообщение Sergey Ivanov »

вот что дома получилось:
Безымянный.jpg


2 ядра (2,93 ггц)
Добро пожаловать на http://rk-stud.ru/

AndreyDmitriev

Activity Professionalism Tutorials Gold Black
VIP
VIP
Сообщения: 1225
Зарегистрирован: 03 фев 2010, 00:42
Награды: 6
Репутация: 0
Версия LabVIEW: 6.1 - 2016
Откуда: Германия
Контактная информация:

Re: Организация параллельных вычислений в цикле

Сообщение AndreyDmitriev »

Sergey Ivanov писал(а):вот что дома получилось:
Вложение Безымянный.jpg больше недоступно


2 ядра (2,93 ггц)


Это всё оттого, что в циклах "вычислений" вообще нет, а фактически есть просто работа с памятью. Так что меряются в основном временные задержки, которые находятся в обвязке цикла (а LabVIEW по качеству кодогенерации довольно убогий). Плюс к памяти обращаться в несколько потоков тоже не очень оптимально, посколько можно огрести кучу промахов кеша.

Надо мерять хотя бы вот так:

par-loops.png


На четырёх ядрах:

par-loops2.png
par-loops2.png (3 КБ) 3500 просмотров


Четырёхкратное ускорение получить обычно не удаётся - четыре ядра это всё-таки не четыре компьютера.

Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
professor
professor
Сообщения: 4930
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Репутация: 0
Версия LabVIEW: 2015, 2016
Откуда: СССР

Re: Организация параллельных вычислений в цикле

Сообщение IvanLis »

Пример немного не удачный...
Но какая задачка, такой и пример :dntknw:

А почему у меня не получилось подключиться на вход "P"?
Точнее подключаюсь, но тогда цикл вообще не выполняется.

AndreyDmitriev

Activity Professionalism Tutorials Gold Black
VIP
VIP
Сообщения: 1225
Зарегистрирован: 03 фев 2010, 00:42
Награды: 6
Репутация: 0
Версия LabVIEW: 6.1 - 2016
Откуда: Германия
Контактная информация:

Re: Организация параллельных вычислений в цикле

Сообщение AndreyDmitriev »

IvanLis писал(а):А почему у меня не получилось подключиться на вход "P"?
Точнее подключаюсь, но тогда цикл вообще не выполняется.

C чего это он не выполняется? Он как раз выполняется, об этом надо судить не по времени выполнения, а по результату.
Константа на входе Р отключает напрочь режим отладки в цикле. По идее тоже самое должно происходить и без константы, однако не происходит. Возможно, маленький баг - тут надо ещё поковыряться.
Вообще все замеры времени выполнения надо производить с отключённым режимом отладки (ну и следить за сворачиванием констант и структур оптимизатором).
Если режим отладки отключить, то все три цикла будут выполняться за близкое к нулю время. ;)

Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
professor
professor
Сообщения: 4930
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Репутация: 0
Версия LabVIEW: 2015, 2016
Откуда: СССР

Re: Организация параллельных вычислений в цикле

Сообщение IvanLis »

Действительно выполняетя!
Так что получается....
Если я на 100% уверен в коде который выполняетяся внутри цикла и хочу организовать вычисления быстро, то достаточно отключить режим отладки.
А для этого можно включить Enable loop iteration parallelism и даже если распараллелить вычисления не возможно по некоторым причинам, то подать на вход "P" значение "1" ???

Аватара пользователя
Sergey Ivanov

Activity Professionalism Gold Автор
expert
expert
Сообщения: 1193
Зарегистрирован: 01 мар 2009, 20:54
Награды: 5
Репутация: 0
Версия LabVIEW: 2013
Откуда: Санкт-Петербург, Кронштадт
Контактная информация:

Re: Организация параллельных вычислений в цикле

Сообщение Sergey Ivanov »

8 ядер:
745646.jpg
Добро пожаловать на http://rk-stud.ru/

AndreyDmitriev

Activity Professionalism Tutorials Gold Black
VIP
VIP
Сообщения: 1225
Зарегистрирован: 03 фев 2010, 00:42
Награды: 6
Репутация: 0
Версия LabVIEW: 6.1 - 2016
Откуда: Германия
Контактная информация:

Re: Организация параллельных вычислений в цикле

Сообщение AndreyDmitriev »

IvanLis писал(а):Действительно выполняетя!
Так что получается....
Если я на 100% уверен в коде который выполняетяся внутри цикла и хочу организовать вычисления быстро, то достаточно отключить режим отладки.
А для этого можно включить Enable loop iteration parallelism и даже если распараллелить вычисления не возможно по некоторым причинам, то подать на вход "P" значение "1" ???


Не, не совсем так.

Во-первых, случаи, когда распараллелить вычисления невозможно "по некоторым причинам", но в то же время можно включить паралеллизм в LabVIEW - они довольно редкие (пример - коммуникация с прибором в цикле, которая должна выполняться строго последовательно).
Обычно же LabVIEW сразу замечает, что паралеллизм включить нельзя, так что подать "1" на вход просто не получится:

loops-par.png

Кроме того, не стоит использовать параллелизм для включения или выключения отладки - это всё-таки разные сущности, не стоит их мешать.

А для отключения режима отладки для части кода надо этот код положить в SubVI, и вот там уже отключить режим отладки.

Ещё одна маленькая тонкость с этим терминалом: LabVIEW всегда использует меньшее из двух установок. Ну, к примеру, если в диалоговом окне для распараллеливания мы установили "2", а на терминал Р подали "4", то всё равно будет сгенерировано только два потока. Таким образом, в диалоговом окне следует устанавливать максимально возможное запланированное число потоков (это не значит, что там всегда надо "64" ставить, но если планируется использовать, скажем до 12 процессоров, то там надо 12 и выставить), и с помощью терминала Р можно уменьшить количество потоков. Количество процессоров, кстати, можно определить, вызвав CPU Information.
Кроме того, в учебнике написано, что могут быть следующие ситуации:
Если подключить -1, то количество потоков будет взято из диалогового окна (так и есть).
Если подключить 0 или оставить терминал не подключённым, то количество потоков будет определно динамически по количеству логических процессоров. На практике я вижу, что значение всё равно берётся из диалогового окна.
Если подключить 1 или больше, то количество потоков будет определяться меньшим из двух (так и есть).

Аватара пользователя
inmaze
user
user
Сообщения: 75
Зарегистрирован: 21 сен 2011, 10:43
Репутация: 0
Версия LabVIEW: 2011
Откуда: Dresden/Germany
Контактная информация:

Re: Организация параллельных вычислений в цикле

Сообщение inmaze »

Господа, ответье, пожалуйста, на несколько вопросов поро режим отладтки.
Что это?
Его можно вкл/выкл для всего Vi? Если да, то как?
Что за вход такой Р в цикле? Он для версий старше какой существует?
Как включить его отображение (Р)?

AndreyDmitriev

Activity Professionalism Tutorials Gold Black
VIP
VIP
Сообщения: 1225
Зарегистрирован: 03 фев 2010, 00:42
Награды: 6
Репутация: 0
Версия LabVIEW: 6.1 - 2016
Откуда: Германия
Контактная информация:

Re: Организация параллельных вычислений в цикле

Сообщение AndreyDmitriev »

inmaze писал(а):Господа, ответье, пожалуйста, на несколько вопросов поро режим отладтки.
Что это?
Его можно вкл/выкл для всего Vi? Если да, то как?


Режим отладки включён по умолчанию. Позволяет отслеживать значение на проводках пробниками и устанавливать точки останова.
Включается/выключается в свойствах прибора:

debug.png

Незначительно замедляет исполнение кода в режиме разработки. При генерации исполняемого файла автоматом отключается.

inmaze писал(а):Что за вход такой Р в цикле? Он для версий старше какой существует?
Как включить его отображение (Р)?


Автораспараллеливание for циклов работает начиная с версии 2009:
Improving Performance with Parallel For Loops

Аватара пользователя
inmaze
user
user
Сообщения: 75
Зарегистрирован: 21 сен 2011, 10:43
Репутация: 0
Версия LabVIEW: 2011
Откуда: Dresden/Germany
Контактная информация:

Re: Организация параллельных вычислений в цикле

Сообщение inmaze »

Спасибо.

K0sinus
junior
junior
Сообщения: 51
Зарегистрирован: 22 ноя 2017, 10:29
Репутация: 0
Версия LabVIEW: 2019
Откуда: Санкт-Петербург
Контактная информация:

Re: Организация параллельных вычислений в цикле

Сообщение K0sinus »

А что за такой вход C(chunk вроде) и для чего он нужен?

Artem.spb

Activity Автор
expert
expert
Сообщения: 1934
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Репутация: 0
Версия LabVIEW: 12-18
Контактная информация:

Re: Организация параллельных вычислений в цикле

Сообщение Artem.spb »

K0sinus писал(а):А что за такой вход C(chunk вроде) и для чего он нужен?
есть подозрение, что за шесть лет все выпали из контекста и не поймыт вопроса.
Я точно не понял.

Ответить

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