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

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

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

Postby IvanLis on 11 Mar 2012, 20:02

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

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

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

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

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

2Core.png
это на 2-х ядерном
2Core.png (1.29 KiB) Viewed 1469 times

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


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

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


--------------
1. Кто-нибудь может объяснить в чем дело.
2. Не имею доступа к 4-х ядерному компу, хотелось бы посмотреть результаты прогонов.
User avatar
IvanLis
professor
professor
 
Posts: 4628
Joined: 02 Dec 2009, 17:44
Location: СССР
Medals: 7
Activity (2) Professionalism (1) Tutorials (1) Gold (1) Man of the year 2012 (1)
Автор (1)
LabVIEW Version: 2010
Karma: 727
hardware VIP bloggers teachers

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

Postby Sergey Ivanov on 11 Mar 2012, 20:53

завтра на работе. у нас типа 8 ядер. попробую что получится
Добро пожаловать на http://rk-stud.ru/
User avatar
Sergey Ivanov
expert
expert
 
Posts: 1193
Joined: 01 Mar 2009, 20:54
Location: Санкт-Петербург, Кронштадт
Medals: 5
Activity (1) Professionalism (1) Gold (2) Автор (1)
LabVIEW Version: 2013
Karma: 117
hardware VIP

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

Postby IvanLis on 11 Mar 2012, 20:59

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


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

но интересно будет все
а то возможность есть, а применения нет
User avatar
IvanLis
professor
professor
 
Posts: 4628
Joined: 02 Dec 2009, 17:44
Location: СССР
Medals: 7
Activity (2) Professionalism (1) Tutorials (1) Gold (1) Man of the year 2012 (1)
Автор (1)
LabVIEW Version: 2010
Karma: 727
hardware VIP bloggers teachers

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

Postby Sergey Ivanov on 11 Mar 2012, 21:18

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


2 ядра (2,93 ггц)
Добро пожаловать на http://rk-stud.ru/
User avatar
Sergey Ivanov
expert
expert
 
Posts: 1193
Joined: 01 Mar 2009, 20:54
Location: Санкт-Петербург, Кронштадт
Medals: 5
Activity (1) Professionalism (1) Gold (2) Автор (1)
LabVIEW Version: 2013
Karma: 117
hardware VIP

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

Postby AndreyDmitriev on 11 Mar 2012, 21:32

Sergey Ivanov wrote:вот что дома получилось:
The attachment Безымянный.jpg is no longer available


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


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

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

par-loops.png


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

par-loops2.png
par-loops2.png (3 KiB) Viewed 1446 times


Четырёхкратное ускорение получить обычно не удаётся - четыре ядра это всё-таки не четыре компьютера.
User avatar
AndreyDmitriev
VIP
VIP
 
Posts: 1225
Joined: 03 Feb 2010, 00:42
Location: Германия
Medals: 6
Activity (1) Professionalism (1) Tutorials (1) Gold (1) Black (2)
LabVIEW Version: 6.1 - 2016
Karma: 433

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

Postby IvanLis on 11 Mar 2012, 22:27

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

А почему у меня не получилось подключиться на вход "P"?
Точнее подключаюсь, но тогда цикл вообще не выполняется.
User avatar
IvanLis
professor
professor
 
Posts: 4628
Joined: 02 Dec 2009, 17:44
Location: СССР
Medals: 7
Activity (2) Professionalism (1) Tutorials (1) Gold (1) Man of the year 2012 (1)
Автор (1)
LabVIEW Version: 2010
Karma: 727
hardware VIP bloggers teachers

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

Postby AndreyDmitriev on 11 Mar 2012, 23:06

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

C чего это он не выполняется? Он как раз выполняется, об этом надо судить не по времени выполнения, а по результату.
Константа на входе Р отключает напрочь режим отладки в цикле. По идее тоже самое должно происходить и без константы, однако не происходит. Возможно, маленький баг - тут надо ещё поковыряться.
Вообще все замеры времени выполнения надо производить с отключённым режимом отладки (ну и следить за сворачиванием констант и структур оптимизатором).
Если режим отладки отключить, то все три цикла будут выполняться за близкое к нулю время. ;)
User avatar
AndreyDmitriev
VIP
VIP
 
Posts: 1225
Joined: 03 Feb 2010, 00:42
Location: Германия
Medals: 6
Activity (1) Professionalism (1) Tutorials (1) Gold (1) Black (2)
LabVIEW Version: 6.1 - 2016
Karma: 433

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

Postby IvanLis on 12 Mar 2012, 07:33

Действительно выполняетя!
Так что получается....
Если я на 100% уверен в коде который выполняетяся внутри цикла и хочу организовать вычисления быстро, то достаточно отключить режим отладки.
А для этого можно включить Enable loop iteration parallelism и даже если распараллелить вычисления не возможно по некоторым причинам, то подать на вход "P" значение "1" ???
User avatar
IvanLis
professor
professor
 
Posts: 4628
Joined: 02 Dec 2009, 17:44
Location: СССР
Medals: 7
Activity (2) Professionalism (1) Tutorials (1) Gold (1) Man of the year 2012 (1)
Автор (1)
LabVIEW Version: 2010
Karma: 727
hardware VIP bloggers teachers

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

Postby Sergey Ivanov on 12 Mar 2012, 07:38

8 ядер:
745646.jpg
Добро пожаловать на http://rk-stud.ru/
User avatar
Sergey Ivanov
expert
expert
 
Posts: 1193
Joined: 01 Mar 2009, 20:54
Location: Санкт-Петербург, Кронштадт
Medals: 5
Activity (1) Professionalism (1) Gold (2) Автор (1)
LabVIEW Version: 2013
Karma: 117
hardware VIP

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

Postby AndreyDmitriev on 12 Mar 2012, 13:04

IvanLis wrote:Действительно выполняетя!
Так что получается....
Если я на 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 или больше, то количество потоков будет определяться меньшим из двух (так и есть).
User avatar
AndreyDmitriev
VIP
VIP
 
Posts: 1225
Joined: 03 Feb 2010, 00:42
Location: Германия
Medals: 6
Activity (1) Professionalism (1) Tutorials (1) Gold (1) Black (2)
LabVIEW Version: 6.1 - 2016
Karma: 433

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

Postby inmaze on 12 Mar 2012, 18:14

Господа, ответье, пожалуйста, на несколько вопросов поро режим отладтки.
Что это?
Его можно вкл/выкл для всего Vi? Если да, то как?
Что за вход такой Р в цикле? Он для версий старше какой существует?
Как включить его отображение (Р)?
User avatar
inmaze
user
user
 
Posts: 75
Joined: 21 Sep 2011, 10:43
Location: Dresden/Germany
LabVIEW Version: 2011
Karma: 8

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

Postby AndreyDmitriev on 12 Mar 2012, 18:29

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


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

debug.png

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

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


Автораспараллеливание for циклов работает начиная с версии 2009:
Improving Performance with Parallel For Loops
User avatar
AndreyDmitriev
VIP
VIP
 
Posts: 1225
Joined: 03 Feb 2010, 00:42
Location: Германия
Medals: 6
Activity (1) Professionalism (1) Tutorials (1) Gold (1) Black (2)
LabVIEW Version: 6.1 - 2016
Karma: 433

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

Postby inmaze on 13 Mar 2012, 15:15

Спасибо.
User avatar
inmaze
user
user
 
Posts: 75
Joined: 21 Sep 2011, 10:43
Location: Dresden/Germany
LabVIEW Version: 2011
Karma: 8

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

Postby K0sinus on 25 Jul 2018, 08:03

А что за такой вход C(chunk вроде) и для чего он нужен?
K0sinus
beginner
beginner
 
Posts: 43
Joined: 22 Nov 2017, 10:29
Location: Санкт-Петербург
LabVIEW Version: 2014
Karma: 0

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

Postby Artem.spb on 25 Jul 2018, 10:20

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

есть подозрение, что за шесть лет все выпали из контекста и не поймыт вопроса.
Я точно не понял.
Artem.spb
expert
expert
 
Posts: 1401
Joined: 31 Jul 2011, 23:05
Medals: 2
Activity (1) Автор (1)
LabVIEW Version: 12,14,15
Karma: 239
CLD hardware I/O VIP freelance

Next

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

Who is online

Users browsing this forum: dadreamer, Google and 11 guests

cron