Я работаю над вычислением временных рядов. Каждая итерация вычисления независима. Может ли кто-нибудь поделиться некоторыми советами/онлайн-праймерами по использованию параллельной обработки в Matlab? Как это можно указать внутри фактического кода?Как использовать параллельную обработку в Matlab
ответ
Поскольку у вас есть доступ к панели инструментов Parallel, я предлагаю вам сначала проверить, можете ли вы сделать это простым способом.
В принципе, вместо того, чтобы писать
for i=1:lots
out(:,i)=do(something);
end
Пишешь
parfor i=1:lots
out(:,i)=do(something);
end
Затем вы используете matlabpool
создать несколько рабочих (вы можете иметь максимум 8 на локальном компьютере с панели инструментов и т. д. на удаленном кластере, если у вас также есть лицензия Distributed Computing Server), и вы запускаете код, и видите хорошие выигрыши в скорости, когда ваши итерации выполняются на 8 ядер вместо одного.
Несмотря на то, что маршрут parfor
является самым простым, он может не работать прямо из коробки, поскольку вы можете ошибочно сделать свою индексацию, или вы можете ссылаться на массив проблематичным образом. Посмотрите на предупреждения mlint в редактор, прочитайте документацию и положитесь на добрые старые пробные версии и ошибки, и вы должны понять это достаточно быстро. Если у вас есть вложенные петли, часто лучше всего распараллеливать только самую внутреннюю и обеспечивать тонну итераций - это не только хороший дизайн, но и уменьшает количество кода, которое может вызвать проблемы.
Обратите внимание, что особенно если вы запустите код на локальном компьютере, вы можете столкнуться с проблемами памяти (которые могут проявляться в очень медленном выполнении в параллельном режиме, поскольку вы выполняете пейджинг): каждый рабочий получает копию рабочей области, поэтому, если ваш расчет предполагает создание массива 500 МБ, 8 сотрудникам потребуется всего 4 ГБ ОЗУ - и тогда вы даже не начали подсчитывать ОЗУ родительского процесса! Кроме того, может быть полезно использовать только N-1 ядра на вашем компьютере, так что осталось еще одно ядро для других процессов, которые могут запускаться на компьютере (например, обязательный антивирус ...).
Mathworks предлагает свои собственные parallel computing toolbox. Если вы не хотите его приобретать, существует несколько вариантов:
- Вы можете написать свой собственный файл mex и использовать pthreads или OpenMP.
- Однако убедитесь, что вы не вызываете любой Mex апи в параллельной части кода, потому что они Арент Потокобезопасная
- Если вы хотите крупнозернистым параллелизм с помощью MPI вы можете попробовать pmatlab
- То же самое с parmatlab
Edit: Добавление ссылка Parallel MATLAB with openmp mex files
Я только попробовал первый.
Вам также может быть интересно узнать, что Parallel Computing Toolbox недавно (R2010b) представил графические процессоры на базе CUDA (требуется карта nvidia, поддерживающая возможность вычисления 1.3): http://www.mathworks.com/discovery/matlab-gpu .html – Amro
Не забывайте, что многие функции Matlab уже многопоточны. При тщательном программировании вы сможете воспользоваться ими - проверьте документацию для своей версии, так как Mathworks, похоже, увеличивает количество и количество многопоточных функций с каждой новой версией. Например, кажется, что 2010a имеет многопоточность fft
s, что может быть полезно для обработки временных рядов.
Если внутренняя многопоточность не то, что вам нужно, то, как предлагает @srean, имеется Parallel Computing Toolbox. Для моих денег (или, точнее, денег моих работодателей) это путь, позволяющий вам параллельно программировать в Matlab, вместо того чтобы болтать. Я тоже должен признать, что я очень впечатлен набором инструментов и предлагаемыми возможностями.
У меня есть доступ к Paral Computing Toolbox Matlab. Можете ли вы поделиться с ними хорошими праймерами/примерами? – Eduardas
@Edward: Я присутствовал на двухдневном учебном курсе Mathworks на PCT, прочитал документацию и отработал ее для себя. Но у меня есть опыт параллельного программирования с Fortran и MPI и OpenMP. Matlab Central все больше уделяет внимание параллельным вычислениям с помощью Matlab, и это может быть местом для начала. –
- 1. Как выполнить параллельную обработку в R?
- 2. Как обеспечить параллельную обработку в Java
- 3. Индексированный db выполняет параллельную обработку?
- 4. Внедрить параллельную обработку цикла for
- 5. Сделать параллельную обработку -j command
- 6. Лучший способ выполнить параллельную обработку в Node.js
- 7. Какие продукты NoSQL поддерживают параллельную обработку запросов?
- 8. Многопоточность - многоядерные процессоры действительно выполняют параллельную обработку?
- 9. Scala: Как ускорить параллельную синхронную обработку в небольшом списке?
- 10. python - используя несколько процессов/параллельную обработку
- 11. Какие структуры данных могут включать параллельную обработку
- 12. Как реализовать параллельную обработку с ** прямой ** конечной точкой в Camel?
- 13. Как выполнить параллельную обработку в скрипте Unix Shell?
- 14. Как включить параллельную обработку на Theano? Нет GPU
- 15. Простейший способ сделать многопоточную/параллельную обработку в Python
- 16. Ускорение поддержки векторной регрессии в Sklearn через параллельную обработку
- 17. Как выполнить параллельную обработку внутри цикла foreach для «requestData»?
- 18. в HFT имеет смысл попробовать параллельную обработку заказов?
- 19. Можно ли использовать параллельную ARPACK в scipy?
- 20. Какую параллельную коллекцию использовать?
- 21. Можно ли использовать параллельную петлю «while» при использовании MATLAB? [Решено]
- 22. Как использовать параллельную обработку в R для анализа больших наборов данных временных рядов
- 23. Как использовать «петлевую» параллельную обработку с использованием GCD (Grand Central Dispatch)
- 24. Как использовать параллельную и последовательную версию MKL?
- 25. Будет ли автономная программа scala использовать распределенную/параллельную обработку? или искры Scala требует отдельный код?
- 26. Как реализовать параллельную обработку сообщения в Mule с помощью VM и Request-Reply Scope
- 27. Как использовать обработку исключений в sql?
- 28. как использовать параллельную прокрутку в андроиде с двумя видами
- 29. Как использовать параллельную потоковую передачу (TPL) в .NET.
- 30. Shiny - Как кодировать параллельную обработку для сценариев source() - ed внутри кнопки действия?
Почему лучше всего распараллелить только самый внутренний цикл? Я прочитал противоположное от всей литературы, на которую я смотрел .NET. Как правило, распараллеливание большого внешнего цикла приводит к тому, что накладные расходы на создание потоков реже, чем параллелизация внутреннего цикла. –
@Joel B: Вы хотите распараллеливать цикл, который выполняет много итераций, поскольку запуск цикла, который делает, скажем, 500 итераций в 1024-ядерном кластере, является довольно пустой тратой. Конечно, ядро параллельного цикла должно занимать больше времени, чем накладные расходы на потоки. Однако это почти всегда верно в Matlab, поскольку вам требуется намного меньше циклов, и, следовательно, расчет внутри даже самого внутреннего цикла довольно тяжелый. – Jonas
Но как насчет только четырехъядерного одиночного ПК? Наверное, сделать внешний цикл имеет смысл? Было бы справедливо сказать, что параллелизм внутреннего цикла лучше, если у меня есть огромный компьютерный кластер в моем распоряжении, но внешний цикл лучше распараллеливать, если у меня есть только один многоядерный ПК? –