Страница 1 из 2

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

Добавлено: 11 мар 2012, 20:02
IvanLis
Организация параллельных вычислений в цикле

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

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

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


Еще не понятно, если необходимо изменить количество потоков в зависимости от конфигурации или ситуации, как это сделать. Т.е. этот вариант не прокатывает, вообще ничего не считается:
Снимок.png
Снимок.png (2.57 КБ) 4738 просмотров
получается только так сконфигурировать:
Снимок-1.png
--------------
1. Кто-нибудь может объяснить в чем дело.
2. Не имею доступа к 4-х ядерному компу, хотелось бы посмотреть результаты прогонов.

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

Добавлено: 11 мар 2012, 20:53
Sergey Ivanov
завтра на работе. у нас типа 8 ядер. попробую что получится

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

Добавлено: 11 мар 2012, 20:59
IvanLis
Sergey Ivanov писал(а):завтра на работе. у нас типа 8 ядер. попробую что получится
по ряду причин меня больше всего интересует 4-х ядерный процессор

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

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

Добавлено: 11 мар 2012, 21:18
Sergey Ivanov
вот что дома получилось:
Безымянный.jpg
2 ядра (2,93 ггц)

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

Добавлено: 11 мар 2012, 21:32
AndreyDmitriev
Sergey Ivanov писал(а):вот что дома получилось:
Вложение Безымянный.jpg больше недоступно
2 ядра (2,93 ггц)
Это всё оттого, что в циклах "вычислений" вообще нет, а фактически есть просто работа с памятью. Так что меряются в основном временные задержки, которые находятся в обвязке цикла (а LabVIEW по качеству кодогенерации довольно убогий). Плюс к памяти обращаться в несколько потоков тоже не очень оптимально, посколько можно огрести кучу промахов кеша.

Надо мерять хотя бы вот так:
par-loops.png
На четырёх ядрах:
par-loops2.png
par-loops2.png (3 КБ) 4715 просмотров
Четырёхкратное ускорение получить обычно не удаётся - четыре ядра это всё-таки не четыре компьютера.

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

Добавлено: 11 мар 2012, 22:27
IvanLis
Пример немного не удачный...
Но какая задачка, такой и пример :dntknw:

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

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

Добавлено: 11 мар 2012, 23:06
AndreyDmitriev
IvanLis писал(а): А почему у меня не получилось подключиться на вход "P"?
Точнее подключаюсь, но тогда цикл вообще не выполняется.
C чего это он не выполняется? Он как раз выполняется, об этом надо судить не по времени выполнения, а по результату.
Константа на входе Р отключает напрочь режим отладки в цикле. По идее тоже самое должно происходить и без константы, однако не происходит. Возможно, маленький баг - тут надо ещё поковыряться.
Вообще все замеры времени выполнения надо производить с отключённым режимом отладки (ну и следить за сворачиванием констант и структур оптимизатором).
Если режим отладки отключить, то все три цикла будут выполняться за близкое к нулю время. ;)

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

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

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

Добавлено: 12 мар 2012, 07:38
Sergey Ivanov
8 ядер:
745646.jpg

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

Добавлено: 12 мар 2012, 13:04
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 или больше, то количество потоков будет определяться меньшим из двух (так и есть).

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

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

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

Добавлено: 12 мар 2012, 18:29
AndreyDmitriev
inmaze писал(а):Господа, ответье, пожалуйста, на несколько вопросов поро режим отладтки.
Что это?
Его можно вкл/выкл для всего Vi? Если да, то как?
Режим отладки включён по умолчанию. Позволяет отслеживать значение на проводках пробниками и устанавливать точки останова.
Включается/выключается в свойствах прибора:
debug.png
Незначительно замедляет исполнение кода в режиме разработки. При генерации исполняемого файла автоматом отключается.
inmaze писал(а): Что за вход такой Р в цикле? Он для версий старше какой существует?
Как включить его отображение (Р)?
Автораспараллеливание for циклов работает начиная с версии 2009:
Improving Performance with Parallel For Loops

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

Добавлено: 13 мар 2012, 15:15
inmaze
Спасибо.

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

Добавлено: 25 июл 2018, 08:03
K0sinus
А что за такой вход C(chunk вроде) и для чего он нужен?

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

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