34 / 34 / 4
Регистрация: 19.02.2013
Сообщений: 118
|
||||||
1 | ||||||
Наладить параллельные вычисления05.01.2015, 16:13. Показов 9400. Ответов 34
Метки || вычисления (Все метки)
Вот основной сценарий расчетов, которые мне нужны.
Погуглил как распараллелить вычисления в матлабе, на русском вообще довольно мало написано. Чтобы топик не выглядел неприлично типа:"Сделайте за меня мою работу", я вкратце опишу основные вопросы и допущения: Мне представляется, что мою проблему решит parfor, вместо for, если просто дописать, матлаб ругается на переменной Res:"Valid indices for 'Res' are restricted in PARFOR loops". Насколько я понял из небольшой статьи, в параллельном цикле нельзя модифицировать некоторые типы используемых переменных, так гарантируется то, что результаты вычислений в каждой итерации не зависят от результатов из прошлых итераций, в противном случае процесс невозможно запустить параллельно. Тут возникает правомерный вопрос: -А как же мне выводить результаты? В той статье, написано, что: "можно сохранить результаты расчёта в разные ячейки cell-array, и агрегировать результаты после завершения parfor цикла." -Что это такое и как это сделать? Кроме того, в упомянутом примере и другой литературе говорится о создании некоего пула. На сколько я понял, пул -это совокупность вычислительных ресурсов, которые участвуют в процессе. - Необходимо ли открывать Пул при вычислениях с parfor на своём компьютере (без удалённых кластеров)? - Как ускорить вычисления при помощи видеокарты? - Для этого годится любая видеокарта, или только со встроенной соответствующей технологией (CUDA или что-то подобное)? Такие в общем вопросики. Заранее спасибо!
0
|
05.01.2015, 16:13 | |
Ответы с готовыми решениями:
34
Параллельные вычисления Параллельные вычисления Параллельные вычисления Параллельные вычисления. |
318 / 257 / 30
Регистрация: 30.03.2013
Сообщений: 755
|
|
05.01.2015, 17:29 | 2 |
Сообщение было отмечено Алексей89 как решение
Решение
Можно привести работающий код, с данными и вызовом функции из основной программы ?
Обычно распаралеливание - не выход, и лучше обычно двигаться в сторону векторизации кода.
0
|
34 / 34 / 4
Регистрация: 19.02.2013
Сообщений: 118
|
||||||
05.01.2015, 19:07 [ТС] | 3 | |||||
Частично разобрался с parfor, оказывается, он не любит любые вычисляемые индексы массивов (кроме итераторов)
Нашёл хороший видеоурок Теперь моя прога выглядит так:
0
|
533 / 438 / 47
Регистрация: 17.07.2013
Сообщений: 2,236
|
|
07.01.2015, 21:32 | 4 |
С применением видеокарт не все так просто. В принципе, любая современная видеокарта (с поддержкой определенной версии CUDA) может ускорить расчеты, но не каждая поддерживает функцию коррекции ошибок, кажется, этот алгоритм называется ЕЕС или ЕСС. Для расчета картинки неправильный расчет одного пикселя может быть визуально и не заметен, а для серьезных расчетов этот вопрос требует проверки. В прошлом году я консультировался с NVIDIO и в результате я взял TITAN. Может быть сейчас еще что-то появилось.
Добавлено через 4 минуты Я буду в Москве после 12 января, могу прогнать Ваш тестовый пример с TITAN и без него.
1
|
318 / 257 / 30
Регистрация: 30.03.2013
Сообщений: 755
|
|
07.01.2015, 21:55 | 5 |
У меня стоит даже 2 GpuDevice Nvidia, но проблема в том, что список функций Матлаба, которые поддерживают GPU очень скромный
([URL="http://http://www.mathworks.com/help/distcomp/run-built-in-functions-on-a-gpu.html"]) и для классификации там ничего нет. Поэтому пробуем делать пока на PGI Fortran, и тоже не очень успешно ...
1
|
34 / 34 / 4
Регистрация: 19.02.2013
Сообщений: 118
|
|
08.01.2015, 00:18 [ТС] | 6 |
Nick07, большое спасибо за предложение, но я так примерно и понял уже, что судя по видеообзору для видеокарточки нужен специфический код.
Пока топлю кухню процом от ноута, в принципе спешить мне некуда, а пока считается я, как советовал sergsh, переделываю некоторые функции (по возможности) под векторные операции. Об относительном приросте производительности я ещё напишу, когда закончу, а тему, я так понимаю пока можно считать закрытой.
0
|
533 / 438 / 47
Регистрация: 17.07.2013
Сообщений: 2,236
|
|
08.01.2015, 18:16 | 7 |
Сообщение было отмечено Алексей89 как решение
Решение
1. Прежде всего надо "зафиксировать" размеры матриц, типа: A = ones ( 1000, 100 )
2. Векторизация безусловно ускоряет вычисления, но на моих данных при переходе на векторизацию проявилась нехватка памяти и пришлось вернуться на обычный цикл. Добавлено через 3 минуты Посмотрите стр 243, да и вся книга довольно интересна: _Дьяконов А Г АНАЛИЗ ДАННЫХ MATLAB ВМК МГУ 2010 я выкладывал ссылку на эту книгу Добавлено через 29 минут И это также интересно, и сама книга и ссылка на сайт, где описываются недокументированные возможности: Accelerating MATLAB Performance source files http://www.mathworks.com/matla... urce-files
1
|
318 / 257 / 30
Регистрация: 30.03.2013
Сообщений: 755
|
|
09.01.2015, 01:04 | 8 |
Векторизация безусловно ускоряет вычисления, но на моих данных при переходе на векторизацию проявилась нехватка памяти и пришлось вернуться на обычный цикл.
Не хватает ОЗУ или памяти видеокарты ?
0
|
533 / 438 / 47
Регистрация: 17.07.2013
Сообщений: 2,236
|
|
10.01.2015, 11:39 | 9 |
ОЗУ, но это для МОЕЙ задачи и при моих 32 Gb. Пришлось менять алгоритм. Вполне возможно, что при векторизации для Вашей задачи всего хватит.
0
|
34 / 34 / 4
Регистрация: 19.02.2013
Сообщений: 118
|
|
11.01.2015, 02:30 [ТС] | 10 |
Ну, что сказать, после всесторонней оптимизации, тот пример, что считался почти трое суток, теперь на одном ядре прогоняется за четверть секунды.
За книжку большое спасибо! когда без лишних переливаний есть чёткий набор конкретных рекомендаций, это всегда удобно. Так что всем большое спасибо! Тема закрыта
0
|
533 / 438 / 47
Регистрация: 17.07.2013
Сообщений: 2,236
|
|
11.01.2015, 10:46 | 11 |
Да рано тему закрывать - самое интересное началось!
А что помогло: изменение алгоритма (подозреваю, что это) или какие игры с MATLAB?
0
|
34 / 34 / 4
Регистрация: 19.02.2013
Сообщений: 118
|
|||||||||||
11.01.2015, 14:29 [ТС] | 12 | ||||||||||
Да, надо сказать, когда я писал код в первый раз, думал не о скорости, а о том, как не допустить систематической ошибки, чтобы всё считалось верно.
А когда подошёл к написанию с позиции оптимизации, оказалось что самый верный рецепт - это не удалять данные которые ещё хоть раз могут пригодиться, так например, вначале темы я приводил цикл:
Сейчас этот кусочек скрипта выглядит так:
0
|
533 / 438 / 47
Регистрация: 17.07.2013
Сообщений: 2,236
|
|
11.01.2015, 14:51 | 13 |
0
|
0 / 0 / 0
Регистрация: 09.01.2016
Сообщений: 10
|
||||||
09.01.2016, 00:31 | 14 | |||||
Помогите и мне понять что происходит при использовании параллельных вычислений. У меня время вычислений значительно возрастает.
Код примитивный:
А вот результат: Elapsed time is 6.453469 seconds. Elapsed time is 42.462830 seconds. Получается что расчет на 4-х ядрах в 7 раз медленнее, чем на одном. Поясните - как такое получается? З.Ы. matlabpool запущен
0
|
6922 / 4963 / 2096
Регистрация: 02.02.2014
Сообщений: 13,192
|
||||||
09.01.2016, 01:38 | 15 | |||||
у меня получился другой результат
Кликните здесь для просмотра всего текста
Elapsed time is 50.439199 seconds. Elapsed time is 0.001857 seconds. Starting matlabpool using the 'local' configuration ... connected to 2 labs. Elapsed time is 1.218348 seconds. Sending a stop signal to all the labs ... stopped. >>
1
|
533 / 438 / 47
Регистрация: 17.07.2013
Сообщений: 2,236
|
|
09.01.2016, 09:12 | 16 |
Для начала между 2-й и 3-й строками зарезервируйте память для своих векторов/матриц, типа:
xj1 = zero (xj1(n) ) ; Добавлено через 2 минуты См. стр. 243 _Дьяконов А Г АНАЛИЗ ДАННЫХ MATLAB ВМК МГУ 2010 г 278 стр
1
|
0 / 0 / 0
Регистрация: 09.01.2016
Сообщений: 10
|
||||||
09.01.2016, 12:03 | 17 | |||||
Krasme, запустил Ваш код в 2012 версии:
Elapsed time is 0.780846 seconds. Elapsed time is 0.054563 seconds. Starting matlabpool using the 'local' profile ... connected to 4 workers. Elapsed time is 2.417867 seconds. Sending a stop signal to all the workers ... stopped. Немного убивает разница в цифрах, не только в скорости параллельных вычислений, но и первая цифра у Вас очень большая. Вопрос, почему у Вас пишет connected to 2 labs, а у меня connected to 4 workers. Вы не на ядра распараллеливаете, а на другие машины? Добавлено через 9 минут Nick07, заметно лучше стали параллельные вычисления. Но всё равно медленнее однопоточного.
Elapsed time is 0.784488 seconds. Elapsed time is 0.001849 seconds. Starting matlabpool using the 'local' profile ... connected to 4 workers. Elapsed time is 1.041601 seconds. Sending a stop signal to all the workers ... stopped.
0
|
6922 / 4963 / 2096
Регистрация: 02.02.2014
Сообщений: 13,192
|
|||||||||||
09.01.2016, 12:06 | 18 | ||||||||||
Little_boo, у меня версия 2010b и двухядерный процессор, ОЗУ 4гб... не знаю, в версии ли дело, у меня вообще на любую задачу матлаб при запуске задумывается, а потом быстро-быстро все и считает, и выводит..
с предопределением массивов у меня все нормально и с первым блоком
0
|
0 / 0 / 0
Регистрация: 09.01.2016
Сообщений: 10
|
||||||
09.01.2016, 12:11 | 19 | |||||
Krasme, наверно, у Вас какой-то глюк на первую операцию. Потому что не может этот цикл на одном ядре выполняться 50 секунд, а время второго варианта и параллельных вычислений у нас примерно одинаковое.
0
|
6922 / 4963 / 2096
Регистрация: 02.02.2014
Сообщений: 13,192
|
|
09.01.2016, 12:14 | 20 |
так второй вариант не тратит время на прогон по циклам, а работает, с матрицами, как с простыми переменными..
см. выше, с предопределением массивом и первый вариан стал быстро работать..
0
|
09.01.2016, 12:14 | |
09.01.2016, 12:14 | |
Помогаю со студенческими работами здесь
20
Параллельные вычисления Параллельные вычисления Параллельные вычисления Параллельные вычисления средствами С++ 11 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |