2015-12-09 3 views
3

Привет, я не очень хорошо знаком с gpu, и у меня есть теоретический вопрос.Возможные варианты расчета части параллельной программы по сравнению с графическим процессором

Так что я работаю над заявкой Sassena, которая вычисляет рассеяние нейтронов по траекториям молекулярной динамики. Это приложение написано параллельно с MPI и очень хорошо работает для процессоров. Но я готов запустить это приложение поверх графического процессора, чтобы ускорить его работу. конечно, не все, а частично. когда я смотрю на Source Code, то, как он работает, является типичным MPI, то есть первый ранг посылает данные каждому узлу индивидуально, а затем каждый узел выполняет расчет. Теперь есть часть вычисления, которое использует Fast Fourier Transform (FFT), которое потребляет больше всего времени, и я хочу отправить эту часть на GPU.

Я вижу 2 решения впереди меня:

  1. когда узлы достигают FFT части, они должны послать назад данные к главному узлу, и когда главный узел собрал все данные, которые он посылает их на GPU, тогда GPU делает FFT, отправляет его обратно в CPU, а cpu делает все остальное.

  2. Каждый узел будет динамически отправлять данные на GPU, а после того, как GPU выполняет БПФ, он отправляет обратно каждому узлу, а остальные выполняет свою работу.

Так что мой вопрос в том, какой из этих двух вариантов возможен. Я знаю, что первый из них выполним, но у него много общения, которое требует много времени. Но второй способ я не знаю, возможно ли вообще или нет. Во втором случае я знаю, что это будет зависеть и от архитектуры компьютера. Но это CUDA или OpenCL, способный на это вообще?

Спасибо за любую идею.

+1

Это звучит скорее как вопрос о внутренней структуре Sassena, чем что-либо, в частности, для программирования GPU. Да, есть библиотеки FFT для CUDA, но как вы их используете с существующей базой кода MPI, на самом деле это не вопрос CUDA. – talonmies

+0

Какова ваша архитектура? У вас есть только gpu в главном узле? Какова пропускная способность вашей сети? Сколько узлов задействовано? Оба решения возможны, и я думаю, что это не будет хорошо. Я хотел бы внести свой вклад, но мне потребуется дополнительная информация. – prmottajr

ответ

1

Насколько я знаю, вы не ограничены CUDA. Здесь вы ограничены количеством используемых вами графических процессоров. Вам нужно создать какую-то очередь, которая распределяет вашу работу с доступными графическими процессорами и отслеживает свободные ресурсы. В зависимости от соотношения между количеством процессоров и количеством графических процессоров и количеством времени, которое требуется каждому FFT, вы можете ждать дольше, чтобы каждый FFT был передан на GPU по сравнению с тем, чтобы делать это только на каждом ядре.

Что я имею в виду, так это то, что вы теряете асинхронное вычисление БПФ, которое выполняется на каждом ядре. Скорее, CPU 2 должны дождаться CPU 1, чтобы завершить свое вычисление FFT, чтобы иметь возможность инициировать новое ядро ​​на графическом процессоре.

Кроме того, что я сказал, можно создать простой мьютекс, который заблокирован, когда ЦП начинает вычислять свой БПФ и разблокируется, когда он заканчивается, так что следующий процессор может использовать графический процессор.

Вы можете посмотреть StarPU. Это api на основе задач, которая может обрабатывать отправку задач на графические процессоры. Он также предназначен для моделей с распределенной памятью.