2009-10-06 3 views
12

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

Итак, мой вопрос в том, как лучше всего начать с многопроцессорного программирования? Я знаком с главным образом развитием Linux в C/C++ и Obj-C на Mac OS X с почти нулевым опытом Windows. Также мой запланированный программный проект потребует БПФ и, возможно, с плавающей точкой сравнения большого количества данных.

Есть OpenCL, OpenMP, MPI, потоки POSIX и т. Д. С какими технологиями я должен начать?

Вот несколько вариантов стека я рассматриваю, но не уверен, что они дадут мне эксперимент в работе над своей целью:

  • Должен ли я получить Snow Leopard и попытаться получить программы OpenCL Obj-C в запустить выполнение на графическом процессоре ATI X1600 на моем ноутбуке? или
  • Должен ли я получить PlayStation и попробовать написать код C до бросить через свои шесть доступных ячеек ядра SPE? или
  • Должен ли я построить ящик Linux с картой Nvidia и попробовать работать с CUDA?

Заранее за вашу помощь.

+1

Установите VS2010 или 2012 под Windows, запустите его, перейдите в F # interactive и введите 'Array.map ((+) 3) [| 1..10 |]'. Вы написали серийную программу F #. Затем введите 'Array.Parallel.map ((+) 3) [| 1..10 |]'. Вы параллельно программируете. –

ответ

3

Если вы заинтересованы в параллелизме в OS X, обязательно ознакомьтесь с Grand Central Dispatch, тем более, что технология была открыта и вскоре может появиться гораздо более широкое применение.

+0

Знаете ли вы, что GCD позволит мне запускать FFT на графическом процессоре X1600? – Talesh

+0

Вы хотите смотреть на OpenCL в этом случае, а не на GCD. GCD предназначен для процессоров, OpenCL - для графических процессоров. –

2

Вам не нужны специальные аппаратные средства, такие как графические карты и ячейки для параллельного программирования. Ваш простой многоядерный процессор также получит прибыль от параллельного программирования. Если у вас есть опыт работы с C/C++ и объектно-c, начните с одного из них и научитесь использовать потоки. Начните с простых примеров, таких как матричное умножение или решение лабиринта, и вы узнаете об этих неприятных проблемах (параллельное программное обеспечение не является детерминированным и полным Heisenbugs).

Если вы хотите перейти в массивный многопараллельность, я бы выбрал openCL, поскольку он самый портативный. У Cuda все еще есть более обширное сообщество, больше документации и примеров, и это немного легче, но у вас будет карточка nvidia.

+0

Я думаю, что CUDA, возможно, будет моим лучшим выбором, поскольку сообщество немного более развито, Nvidia, похоже, привержена HPC и хорошо ... ее C и Linux. Я до сих пор не знаю, сможет ли GPU запускать такие вещи, как FFT, или даже если этот вопрос имеет смысл вообще! – Talesh

+0

FFT имеет большой смысл. См. Например http://www.macresearch.org/cuda-quick-look-and-comparison-fft-performance –

4

Я бы предпочел сначала начать работу с OpenMP и MPI, но не уверен, что это важно, но вы определенно должны хотеть (по-моему :-)) изучить как общие, так и распределенные подходы к параллельной вычислительной технике.

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

Я бы придерживался C/C++ на вашем Mac, так как вы уже знакомы с ними, и есть хорошие библиотеки OpenMP и MPI с открытым исходным кодом для этой платформы и этих языков.

И для некоторых из нас это большой плюс, независимо от того, что вы узнаете о C/C++ и MPI (в меньшей степени это относится и к OpenMP), послужит вам хорошо, когда вы закончите настоящие суперкомпьютеры.

Все субъективные и аргументированные, поэтому игнорируйте это, если хотите.

+0

Привет, Марк, У вас есть несколько ссылок, которые вы можете отправить мне, чтобы начать работу с OpenMP и MPI? -Talesh -Talesh – Talesh

3

Традиционное и императивное «совместное государство с замками» - не единственный ваш выбор. Богатый Хикки, создатель Clojure, Lisp 1 для JVM, делает очень убедительный аргумент против общего состояния. Он в основном утверждает, что добиться практически невозможно. Возможно, вам захочется прочитать сообщения, передающие актеры или исполнители Erlang или библиотеки STM.

0

Возможно, ваша проблема подходит для парадигмы MapReduce. Он автоматически заботится о балансировке нагрузки и проблемах параллелизма, исследовательский документ от Google уже является классическим. У вас есть одномоторная реализация под названием Mars, работающая на графических процессорах, это может сработать для вас. Существует также Phoenix, который выполняет преобразование карт на многоядерные и симметричные мультипроцессоры.

0

Я бы начал с MPI, когда вы узнаете, как бороться с распределенной памятью. Pacheco's book - это старина, но хорошая штучка, и MPI отлично работает из коробки на OS X, что дает неплохую многоядерную производительность.