Параллельно вычислительной среде MATLAB Toolbox и Parallization против ГПУ?

Я работаю с кем-то, у кого есть код MATLAB, который они хотят ускорить. В настоящее время они пытаются преобразовать весь этот код в CUDA, чтобы заставить его работать на CPU. Я думаю, что было бы быстрее использовать параллельный вычислительный инструментарий MATLAB для ускорения этого и запустить его на кластере, который имеет распределенный вычислительный инструментарий MATLAB, что позволяет мне запускать это через несколько разных рабочих узлов. Теперь, как часть Parallel computing toolbox, вы можете использовать такие вещи, как GPUArray. Тем не менее, я смущен тем, как это будет работать. Совместимы ли такие вещи, как parfor (распараллеливание) и gpuarray (программирование на gpu), друг с другом? Могу ли я использовать оба? Может ли что-то быть разделено на разные рабочие узлы (распараллеливание), а также использовать любые графические процессоры, доступные для каждого рабочего?

Они считают, что все еще стоит изучить время, необходимое для преобразования всего кода matlab в код cuda для работы на машине с несколькими графическими процессорами...но я думаю, правильным подходом было бы использовать функции, уже встроенные в MATLAB.

любая помощь, совет, направление будет действительно оценили!

спасибо!

3 ответов


при использовании parfor вы эффективно разделяете цикл for на задачи с одной задачей на итерацию цикла и разделяете эти задачи, которые будут вычисляться параллельно несколькими работниками, где каждый работник может рассматриваться как сеанс MATLAB без интерактивного GUI. Вы настраиваете кластер для запуска заданного числа работников на каждом узле кластера (как правило, вы выбираете число работников, равное числу доступных ядер процессора на этом узел.)

с другой стороны, gpuarray указывает MATLAB, что вы хотите сделать матрицу доступной для обработки GPU. Под капотом MATLAB сортирует данные из основной памяти во внутреннюю память графической платы. Некоторые функции MATLAB (их список есть в документации) могут работать на gpuarrays, и вычисления происходят на GPU.

ключевые различия между двумя методами заключаются в том, что вычисления parfor происходят на процессорах узлов кластера с прямым доступом к основной памяти. Ядра ЦП обычно имеют высокую тактовую частоту, но в кластере ЦП их обычно меньше, чем ядер GPU. По отдельности ядра GPU медленнее, чем типичное ядро CPU, и их использование требует передачи данных из основной памяти в видеопамять и обратно, но в кластере их намного больше. Насколько я знаю, гибридные подходы должны быть возможны, в которых у вас есть кластер ПК и каждый ПК имеет одну или несколько плат Nvidia Tesla, и вы используете как петли parfor, так и gpuarrays. Однако у меня еще не было случая попробовать.


Если вы в основном заинтересованы в моделировании, обработка GPU является идеальным выбором. Однако, если вы хотите проанализировать (большой) сведения, идти с Parallization. Причина этого в том, что обработка GPU только быстрее, чем обработка cpu, если вам не нужно копировать данные туда и обратно. В случае моделирования вы можете сгенерировать большую часть данных на GPU и скопировать результат обратно. Если вы попытаетесь работать с большими данными на GPU, вы очень часто столкнетесь с проблемами с памятью. Parallization это здорово, если у вас есть большие структуры данных и более 2-х ядер в процессоре компьютера.


Если вы напишете его в CUDA, он гарантированно будет работать параллельно на уровне чипа по сравнению с лучшим предположением MATLAB для непараллельной архитектуры и ваших лучших усилий, чтобы заставить его работать параллельно.

вроде как питьевая свежая горная вода стекает по сравнению с покупкой фильтрованной воды. Идите с решением пуристов.