Как сделать аппаратно-независимое параллельное программирование? - PullRequest
11 голосов
/ 17 июня 2011

В наши дни существует два основных аппаратных окружения для параллельного программирования: одно - многопоточное ЦП, а другое - графические карты, которые могут выполнять параллельные операции над массивами данных.

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

Существуют ли какие-либо программные библиотеки / языковые конструкции, которые позволяют это?

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

Если вы хотите, чтобы я был более конкретным в отношении платформы / языка, я бы хотел, чтобы ответ был о C ++, Scala или Java.

Спасибо

Ответы [ 6 ]

5 голосов
/ 17 июня 2011

Исследовательская группа Мартина Одерского в EPFL недавно получила Европейский исследовательский грант на несколько миллионов евро, чтобы ответить именно на этот вопрос.(Статья содержит несколько ссылок на статьи с более подробной информацией.)

5 голосов
/ 17 июня 2011

Через несколько лет программы перезапишут себя с нуля во время выполнения (эй, а почему бы и нет?) ...

... на данный момент (насколько я знаю)это возможно только для целевых групп связанных параллельных систем с заданными парадигмами, а графический процессор ("смущающе параллельный") значительно отличается от "обычного" процессора (2-8 "потоков").) значительно отличается от процессорного суперкомпьютера 20 КБ.

На самом деле существуют параллельные среды выполнения / библиотеки / протоколы, такие как Charm ++ или MPI (представьте себе «актеров»), которые могут масштабироваться - с помощью специально разработанных алгоритмов для решения определенных проблем - от одного ЦП до десятков тысяч процессоров, так что приведенное выше - немного гипербола,Однако существуют огромные принципиальные различия между графическим процессором или даже микропроцессором Cell и гораздо более универсальным процессором.

Иногда квадратный колышек просто не даетt в круглое отверстие.

NoFit

Счастливое кодирование.

4 голосов
/ 14 сентября 2011

OpenCL предназначен для запуска одного и того же кода на процессорах и графических процессорах, на любой платформе (Cell, Mac, PC ...).

Из Java вы можете использовать JavaCL , который является объектно-ориентированной оберткой вокруг API OpenCL C, которая сэкономит вам много времени и усилий (справляется с распределением памяти и нагрузками преобразования, а также имеет некоторые дополнительные функции).

Из Scala,есть ScalaCL , который основан на JavaCL, чтобы полностью скрыть язык OpenCL: он преобразует некоторые части вашей Scala-программы в код OpenCL во время компиляции (для этого поставляется плагин компилятора).

Обратите внимание, что Scala представляет параллельные коллекции как часть своей стандартной библиотеки начиная с 2.9.0, которые можно использовать очень похоже на параллельные коллекции ScalaCL с поддержкой OpenCL (параллельные коллекции Scala можно создавать из обычных коллекций с помощью .par, в то время как параллельные коллекции ScalaCL создаются с .cl).

1 голос
/ 17 июня 2011

Конечно. См. ScalaCL для примера, хотя на данный момент это еще альфа-код. Также обратите внимание, что он использует некоторые библиотеки Java, которые выполняют то же самое.

1 голос
/ 17 июня 2011

(очень) недавно анонсированный MS C ++ AMP выглядит как то, что вы ищете. Кажется (после прочтения новостных статей), что изначально он был нацелен на использование графических процессоров, но более долгосрочной целью, по-видимому, является включение и многоядерности.

0 голосов
/ 12 августа 2011

Я опишу более теоретический ответ.

Различные параллельные аппаратные архитектуры реализуют разные модели вычислений.Трудно соединить их между собой.

В последовательном мире мы с радостью взломали одну и ту же модель вычислений: машину произвольного доступа.Это создает хороший общий язык между разработчиками аппаратного обеспечения и разработчиками программного обеспечения.

Такой единой оптимальной модели для параллельных вычислений не существует.С момента появления современных компьютеров было исследовано большое пространство дизайна;Текущие многоядерные процессоры и графические процессоры занимают лишь небольшую часть этого пространства.

Соединение этих моделей сложно, потому что параллельное программирование в основном связано с производительностью.Обычно вы заставляете что-то работать на двух разных моделях или системах, добавляя слой абстракции, чтобы скрыть детали.Однако редко, когда абстракция не сопровождается затратами на производительность.Это обычно приводит к тому, что у вас общий нижний знаменатель обеих моделей.

А теперь отвечаем на ваш реальный вопрос.Наличие вычислительной модели (язык, ОС, библиотека и т. Д.), Которая не зависит от ЦП или ГП, обычно не будет абстрагироваться от обоих, сохраняя при этом полную мощность, которую вы привыкли использовать с ЦП, из-за снижения производительности.Чтобы все было относительно эффективно, модель будет ориентироваться на графические процессоры, ограничивая свои возможности.

Серебряная подкладка:
То, что происходит, - это гибридные вычисления.Некоторые вычисления больше подходят для других типов архитектур.Вы также редко выполняете только один тип вычислений, так что «достаточно умный компилятор / среда выполнения» сможет различить, какая часть ваших вычислений должна выполняться на какой архитектуре.

...