Arhn - архитектура программирования

Как использовать параллельную обработку в Matlab

Я работаю над расчетом на основе временного ряда. Каждая итерация расчета независима. Может ли кто-нибудь поделиться некоторыми советами / онлайн-учебниками по использованию параллельной обработки в Matlab? Как это можно указать внутри фактического кода?


Ответы:


1

Поскольку у вас есть доступ к набору инструментов Parallel, я предлагаю вам сначала проверить, можете ли вы сделать это простым способом.

В общем, вместо того, чтобы писать

for i=1:lots
   out(:,i)=do(something);
end

Ты пишешь

parfor i=1:lots
   out(:,i)=do(something);
end

Затем вы используете matlabpool для создания нескольких рабочих процессов (у вас может быть максимум 8 на вашей локальной машине с набором инструментов и тонны на удаленном кластере, если у вас также есть лицензия на сервер распределенных вычислений), и вы запускаете код, и увидеть хороший прирост скорости, когда ваши итерации выполняются 8 ядрами вместо одного.

Несмотря на то, что маршрут parfor является самым простым, он может не работать прямо из коробки, так как вы можете неправильно индексировать или ссылаться на массив проблематичным образом и т. д. Посмотрите на предупреждения mlint в редакторе, прочитайте документацию, и полагаться на старые добрые пробы и ошибки, и вы должны понять это достаточно быстро. Если у вас есть вложенные циклы, часто лучше всего распараллелить только самый внутренний цикл и убедиться, что он выполняет множество итераций — это не только хороший дизайн, но также уменьшает объем кода, который может доставить вам проблемы.

Обратите внимание, что особенно если вы запускаете код на локальном компьютере, вы можете столкнуться с проблемами памяти (которые могут проявляться в очень медленном выполнении в параллельном режиме из-за подкачки): каждый рабочий процесс получает копию рабочей области, поэтому, если ваши вычисления предполагает создание массива размером 500 МБ, 8 воркерам потребуется всего 4 ГБ ОЗУ — и тогда вы даже не начали считать ОЗУ родительского процесса! Кроме того, может быть полезно использовать только ядра N-1 на вашем компьютере, чтобы оставалось одно ядро ​​​​для других процессов, которые могут работать на компьютере (например, обязательный антивирус...).

30.10.2010
  • Почему лучше распараллелить только самый внутренний цикл? Я читал противоположное из всей литературы, которую я просматривал для .NET. Как правило, распараллеливание большого внешнего цикла влечет за собой накладные расходы на создание потоков реже, чем распараллеливание внутреннего цикла. 25.11.2010
  • @Joel B: Вы хотите распараллелить цикл, который выполняет много итераций, поскольку запуск цикла, который выполняет, скажем, 500 итераций на 1024-ядерном кластере, является пустой тратой времени. Конечно, ядро ​​распараллеленного цикла должно занимать больше времени, чем накладные расходы на создание потока. Однако это почти всегда верно в Matlab, поскольку вам требуется гораздо меньше циклов, и поэтому вычисления даже в самом внутреннем цикле довольно тяжелы. 25.11.2010
  • Но как насчет четырехъядерного одиночного ПК? Возможно, выполнение внешнего цикла имеет больше смысла? Будет ли справедливо сказать, что распараллеливать внутренний цикл лучше, если в моем распоряжении есть огромный компьютерный кластер, а внешний цикл лучше распараллелить, если у меня есть только один многоядерный ПК? 25.11.2010
  • @Joel B: Даже в этом случае лучше распараллелить цикл с множеством итераций. Если вы запустите 4 параллельных потока, один из них будет медленнее, потому что его ядро ​​​​также выполняет задания ОС. Если вы выполняете параллельные задания на ядрах с разной скоростью, вам не нужно ждать, пока одно из ядер завершит последнюю итерацию. Это намного проще, если есть много итераций. Опять же, вы должны сбалансировать возможное время ожидания с накладными расходами на распараллеливание. С Matlab эти накладные расходы никогда не были для меня проблемой, .Net может быть другим. 25.11.2010

  • 2

    Mathworks предлагает собственный инструментарий для параллельных вычислений. Если вы не хотите покупать это, есть несколько вариантов

    • Вы можете написать свой собственный mex-файл и использовать pthreads или OpenMP.
    • Однако убедитесь, что вы не вызываете API Mex в параллельной части кода, потому что они не являются потокобезопасными.
    • Если вам нужен более грубый параллелизм через MPI, вы можете попробовать pmatlab
    • То же самое с parmatlab

    Изменить: Добавление ссылки Параллельный MATLAB с файлами openmp mex

    Я пробовал только первый.

    30.10.2010
  • вам также может быть интересно узнать, что Parallel Computing Toolbox недавно (R2010b) представил вычисления на GPU на основе CUDA (требуется карта nvidia, поддерживающая вычислительные возможности 1.3): mathworks.com/discovery/matlab-gpu.html 30.10.2010

  • 3

    Не забывайте, что многие функции Matlab уже являются многопоточными. При тщательном программировании вы можете воспользоваться ими - проверьте документацию для вашей версии, поскольку Mathworks, кажется, увеличивает диапазон и количество многопоточных функций с каждым новым выпуском. Например, кажется, что 2010a имеет многопоточные fft, которые могут быть полезны для обработки временных рядов.

    Если встроенная многопоточность вам не нужна, то, как предлагает @srean, доступен Parallel Computing Toolbox. За мои деньги (точнее, деньги моих работодателей) это путь, позволяющий вам программировать параллельно в Matlab, вместо того, чтобы прикручивать вещи. Я также должен признать, что я весьма впечатлен набором инструментов и возможностями, которые он предлагает.

    30.10.2010
  • У меня есть доступ к набору инструментов Parallel Computing Toolbox от Matlab. Можете ли вы поделиться какими-нибудь хорошими учебниками/примерами по его использованию? 30.10.2010
  • @Edward: я посетил двухдневный учебный курс Mathworks по PCT, прочитал документацию и разработал ее для себя. Но у меня есть опыт параллельного программирования на Fortran, MPI и OpenMP. В Matlab Central появляется все больше материалов о параллельных вычислениях с Matlab, с этого можно было бы начать. 30.10.2010
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..