Из какой модели параллельного программирования Вы рекомендуете сегодня использовать в своих интересах manycore процессоры завтра?

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

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

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

46
задан Jeremy Friesner 27 September 2010 в 02:12
поделиться

21 ответ

Многоядерное программирование может на самом деле потребовать больше чем одной парадигмы. Некоторые текущие соперники:

  1. MapReduce. Это работает хорошо, где проблема может быть легко разложена на параллельные блоки.
  2. Вложенный Параллелизм Данных . Это подобно MapReduce, но на самом деле поддерживает рекурсивное разложение проблемы, даже когда рекурсивные блоки имеют неправильный размер. Ищите АРИФМЕТИЧЕСКИЙ ПРОЦЕССОР, чтобы быть большой победой на чисто функциональных языках, работающих на но ограниченных аппаратных средствах с массовым параллелизмом (как GPU).
  3. программное обеспечение Транзакционная Память . При необходимости в традиционных потоках STM делает их терпимыми. Вы платите 50%-ю производительность, пораженную в критических разделах, но можно масштабировать сложные схемы блокировки к 100 с процессоров без боли. Это не будет, однако, работать на распределенные системы.
  4. Параллель возражают потокам с обменом сообщениями . Эта действительно умная модель используется Erlang. Каждый "объект" становится легким потоком, и объекты связываются асинхронными сообщениями и сопоставлением с образцом. Это - в основном истинное параллельное OO. Это успешно выполнилось приятно в нескольких реальных приложениях, и это работает отлично для ненадежных распределенных систем.

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

27
ответ дан emk 26 November 2019 в 20:22
поделиться

Erlang является большим "зрелым решением" и является портативным и с открытым исходным кодом. Я возился с Полифоническим C#, я не знаю, как он должен был бы каждый день программировать в нем.

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

0
ответ дан AlePani 26 November 2019 в 20:22
поделиться

Я использовал бы Java - его портативное устройство так будущая привычка процессоров быть проблемой. Я также кодировал бы свое приложение со слоями, разделяющими интерфейс / логика и данные (больше как 3 веб-приложения уровня) со стандартными взаимоисключающими стандартными программами как библиотека (меньше отладки параллельного кода). Помните, что масштаб веб-серверов ко многим процессорам действительно хорошо и является наименее болезненным путем к многоядерному. Или это или взгляд на старую модель Connection Machine с виртуальным процессором, связанным с данными.

0
ответ дан zurk 26 November 2019 в 20:22
поделиться

Если Ваша проблемная область разрешает попытке ничто не думать о доле модель. Чем меньше Вы совместно используете между процессами и потоками, тем меньше необходимо разработать сложные модели параллелизма.

1
ответ дан Daniel 26 November 2019 в 20:22
поделиться

Спокойные параллельные предложения реализация MapReduce для многоядерного, который действительно прост в использовании. Это - multiOS.

1
ответ дан fulmicoton 26 November 2019 в 20:22
поделиться

Я удивлен, что никто не предложил MPI (Интерфейс передачи сообщений). В то время как разработано для распределенной памяти, программы MPI с существенной и частой глобальной связью (решающий линейные и нелинейные уравнения с миллиардами неизвестных), как показывали, масштабировались к 200k ядрам.

2
ответ дан Jed 26 November 2019 в 20:22
поделиться

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

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

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

2
ответ дан smo 26 November 2019 в 20:22
поделиться

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

2
ответ дан Kevin Little 26 November 2019 в 20:22
поделиться

Я держу пари при передаче циклов событий с обещаниями, как понято в системах как Скрученный , E, AmbientTalk и другие. Они сохраняют способность записать код с теми же предположениями модели выполнения как non-concurrent/parallel приложения, но масштабирующийся к распределенным и параллельным системам. (Вот почему я работаю над Светло-бежевый цвет .)

4
ответ дан Allen 26 November 2019 в 20:22
поделиться

kamaelia платформа Python для того, чтобы создать приложения с большим количеством коммуникационных процессов.

Kamaelia - Параллелизм сделал полезным, забавным

В Kamaelia Вы системы сборки от [1 110] простые компоненты, которые говорят друг с другом . Эта разработка скоростей, в широком масштабе помогает обслуживанию и также означает Вас сборка естественно параллельное программное обеспечение . Это предназначается, чтобы быть доступным [1 112] любой разработчик, включая новичков. Это также делает его забавой:)

, Какой системы? Сетевые серверы, клиенты, настольные приложения, pygame базирующиеся игры, транскодируют системы и конвейеры, системы цифрового телевидения, спам eradicators, обучающие инструменты и изрядное количество больше:)

См. также Вопрос Многоядерный и Параллелизм - Языки, Библиотеки и Методы Разработки

5
ответ дан Glorfindel 26 November 2019 в 20:22
поделиться

Для тяжелых вычислений и т.п., чисто функциональных языков как Haskell легко parallelizable без любого усилия со стороны программиста. Кроме изучения Haskell, который является.

Однако я не думаю, что это - способ (почти) будущее, просто потому что слишком много программистов слишком привыкли к парадигме императивного программирования.

6
ответ дан Thomas 26 November 2019 в 20:22
поделиться

Для приложения.NET я выбираю" .NET Parallel Extensions (PLINQ)", это чрезвычайно просто в использовании и позволяет мне параллелизировать существующий код в минутах.

  1. просто учиться
  2. Используемый для выполнения сложных операций по большим массивам объектов, таким образом, я не могу прокомментировать другие приложения
  3. , задачи Поддержек и piplines
  4. Должны поддерживаться для следующих нескольких годы, но кто знает наверняка?
  5. версия CTP имеет некоторые проблемы производительности, но уже выглядит очень перспективной.

Моно , вероятно, доберется поддержка PLINQ, таким образом, это могло быть межплатформенное решение также.

10
ответ дан aku 26 November 2019 в 20:22
поделиться

mapreduce/hadoop парадигма полезна, и релевантна. Специально для людей, которые привыкли к языкам как жемчуг, идея отобразиться по массиву и сделать некоторое действие с каждым элементом должна прибыть довольно жидко и естественно, и mapreduce/hadoop просто берет его к следующему этапу и говорит, что нет никакой причины, что каждый элемент массива должен быть обработанным на той же машине.

В некотором смысле это - больше протестированного сражения, потому что Google использует mapreduce, и много людей использовало hadoop, и показал, что это работает хорошо на масштабирование приложений через несколько машин по сети. И если можно масштабироваться по нескольким машинам по сети, можно масштабироваться по нескольким ядрам в единственной машине.

11
ответ дан Daniel Papasian 26 November 2019 в 20:22
поделиться

Два решения, которые я действительно люблю, исчисление соединения ( JoCaml, Полифонический C#, ‰ CП ) и модель агента ( Erlang, Scala, E, Io).

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

  1. Люди понимают транзакции в базах данных
  2. уже существует разговор о транзакционных аппаратных средствах RAM
  3. так, как все мы желаем им уведенный, потоки, вероятно, будут доминирующей моделью параллелизма в течение следующих нескольких десятилетий, печальных, как это может быть. STM мог значительно уменьшить боль.
14
ответ дан Jörg W Mittag 26 November 2019 в 20:22
поделиться

Очередь заданий с системой с несколькими рабочими (не уверены в правильной терминологии - очередь сообщений?)

Почему?

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

Кроме того, в отличие от причин, по которым, скажем, Haskell или Erlang настолько параллельны / параллелизованы (?), Он полностью независим от языка - вы можете легко реализовать такую ​​систему на C, Python или любом другом языке (даже с использованием сценариев оболочки), тогда как я сомневаюсь, что bash получит программную транзакционную память или объединенное исчисление в ближайшее время.

1
ответ дан 26 November 2019 в 20:22
поделиться

Кажется, этот вопрос продолжает появляться в разных формулировках - возможно, в StackOverflow есть разные группы. Программирование на основе потоков (FBP) - это концепция / методология, которая существует уже более 30 лет и используется для обработки большей части пакетной обработки в крупном канадском банке. Он имеет реализации на основе потоков в Java и C #, хотя более ранние реализации были основаны на волокне (C ++ и Ассемблер мэйнфрейма - тот, который использовался в банке). Большинство подходов к проблеме использования преимуществ многоядерности включают попытку взять обычную однопоточную программу и выяснить, какие части могут работать параллельно. FBP использует другой подход: приложение с самого начала спроектировано в виде нескольких «черных ящиков». компоненты, работающие асинхронно (представьте производственную сборочную линию). Поскольку интерфейс между компонентами представляет собой потоки данных, FBP по существу не зависит от языка и, следовательно, поддерживает многоязыковые приложения и предметно-ориентированные языки. По этой же причине минимизированы побочные эффекты. Его также можно описать как модель «ничего не разделять» и MOM (промежуточное программное обеспечение, ориентированное на сообщения). MapReduce кажется частным случаем FBP. FBP отличается от Erlang главным образом тем, что Erlang оперирует множеством короткоживущих потоков, поэтому зеленые потоки здесь более уместны, тогда как FBP использует меньше (обычно от нескольких десятков до нескольких сотен) долгоживущих потоков. Для части пакетной сети, которая использовалась ежедневно более 30 лет, см. часть пакетной сети . Для высокоуровневого дизайна интерактивного приложения см. Маклерское приложение высокого уровня . Было обнаружено, что FBP приводит к созданию гораздо более удобных в обслуживании приложений и сокращению затраченного времени - даже на одноядерных машинах!

2
ответ дан 26 November 2019 в 20:22
поделиться

Мы использовали PARLANSE , язык параллельного программирования с явной спецификацией параллелизма в частичном порядке за последнее десятилетие, реализовать масштабируемую систему анализа и преобразования программ ( DMS Software Reengineering Toolkit ), которая в основном выполняет символьные, а не числовые вычисления. PARLANSE - это скомпилированный C-подобный язык с традиционными скалярными типами данных: символьный, целочисленный, с плавающей запятой, динамические типы данных: строка и массив, структура и объединение составных типов данных, а также функции с лексической областью видимости. Хотя большая часть языка является ванильным (арифметические выражения над операндами, операторы if-then-else, циклы do, вызовы функций), параллелизм - нет. Параллелизм выражается путем определения отношения «предшествует» по блокам кода (например, a до b, a до c, d до c) составные типы данных структура и объединение, а также функции с лексической областью видимости. Хотя большая часть языка является ванильным (арифметические выражения над операндами, операторы if-then-else, циклы do, вызовы функций), параллелизм - нет. Параллелизм выражается путем определения отношения «предшествует» по блокам кода (например, a до b, a до c, d до c) составные типы данных структура и объединение, а также функции с лексической областью видимости. Хотя большая часть языка является ванильным (арифметические выражения над операндами, операторы if-then-else, циклы do, вызовы функций), параллелизм - нет. Параллелизм выражается путем определения отношения «предшествует» по блокам кода (например, a до b, a до c, d до c) записывается как

(|;  a  (... a's computation)
     (<< a) b ( ... b's computation ... )
     (<< a) c ( ....c's computation ...)
     (>> c) d ( ... d's computation...)
)|;

, где операторы << и >> относятся к «порядку во времени». Компилятор PARLANSE может видеть эти параллельные вычисления и заранее выделять все структуры, необходимые для вычислений. зерна a, b, c, d, и сгенерировать собственный код для запуска / остановки каждого из них, тем самым минимизируя накладные расходы на запуск и остановку этих параллельных гранул.

См. эту ссылку для параллельного итеративного поиска углубления для оптимальные решения головоломки 15 , которая является старшим братом 4x4 головоломки 8. Он использует только потенциальную параллель в качестве конструкции параллелизма (|| abcd) , которая говорит, что нет ограничений частичного порядка на вычисления a b c d , но он также использует предположения и асинхронно прерывает задачи, которые не могут найти решения. Много идей в очень небольшом фрагменте кода.

PARLANSE работает на многоядерных компьютерах. В большой программе PARLANSE (мы построили многие с более чем 1 миллионом строк) будут тысячи таких частичных заказов, До сих пор у нас были хорошие результаты с использованием до 8 процессоров и скромная отдача с использованием до 16, и мы все еще настраиваем систему. (Мы думаем, что реальная проблема с большим количеством ядер на современных ПК - это пропускная способность памяти: 16 ядер, перегружающие подсистему памяти, создают огромную потребность в пропускной способности).

Большинство других языков не раскрывают параллелизм, поэтому его трудно найти, и системы времени выполнения платят высокую цену за планирование вычислений с помощью примитивов планирования общего назначения. Мы думаем, что это рецепт катастрофы или, по крайней мере, плохой производительности из-за закона Амдала: если количество машинных инструкций для планирования зерна велико по сравнению с работой, вы не сможете работать эффективно. OTOH, если вы настаиваете на вычислительных зернах с множеством машинных инструкций, чтобы снизить затраты на планирование, вы можете: • находить независимые вычислительные гранулы, поэтому у вас нет полезного параллелизма для планирования. Таким образом, ключевая идея PARLANSE состоит в том, чтобы минимизировать затраты на планирование зерен, чтобы зерна могли быть маленькими, чтобы их можно было найти в реальном коде. Понимание этого компромисса пришло из вопиющего провала парадигмы чистого потока данных, которая делала все параллельно с крошечными параллельными порциями (например, оператором добавления).

Мы работали над этим время от времени в течение десятилетия. Трудно понять это правильно. Я не понимаю, как у людей, которые не создавали параллельные языки и не использовали / не настраивали их для этого периода времени, есть серьезные шансы на создание эффективных параллельных систем.

Таким образом, ключевая идея PARLANSE состоит в том, чтобы минимизировать затраты на планирование зерен, чтобы зерна могли быть маленькими, чтобы их можно было найти в реальном коде. Понимание этого компромисса пришло из вопиющего провала парадигмы чистого потока данных, которая делала все параллельно с крошечными параллельными фрагментами (например, с оператором добавления).

Мы работали над этим время от времени в течение десятилетия. Трудно понять это правильно. Я не понимаю, как у людей, которые не создавали параллельные языки и не использовали / не настраивали их для этого периода времени, есть серьезные шансы на создание эффективных параллельных систем.

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

Мы работали над этим время от времени в течение десятилетия. Трудно понять это правильно. Я не понимаю, как у людей, которые не создавали параллельные языки и не использовали / не настраивали их для этого периода времени, есть серьезные шансы на создание эффективных параллельных систем.

это делало все параллельно с крошечными параллельными фрагментами (например, с оператором добавления).

Мы работали над этим время от времени в течение десяти лет. Трудно понять это правильно. Я не понимаю, как у людей, которые не создавали параллельные языки и не использовали / не настраивали их для этого периода времени, есть серьезные шансы на создание эффективных параллельных систем.

который делал все параллельно с крошечными параллельными фрагментами (например, с оператором добавления).

Мы работали над этим время от времени в течение десяти лет. Трудно понять это правильно. Я не понимаю, как у людей, которые не создавали параллельные языки и не использовали / не настраивали их для этого периода времени, есть серьезные шансы на создание эффективных параллельных систем.

1
ответ дан 26 November 2019 в 20:22
поделиться

Полезным путем может быть OpenCL , который обеспечивает средства распределения определенных видов вычислительных нагрузок по разнородным вычислительным ресурсам, IE тот же код будет работать на многоядерном ЦП и также обычные графические процессоры. ATI недавно выпустила именно такую ​​ инструментальную цепочку . Набор инструментов NVidia CUDA аналогичен, хотя и несколько более ограничен. Также похоже, что у Nvidia есть OpenCL sdk в разработке

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

1
ответ дан 26 November 2019 в 20:22
поделиться

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

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

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

1
ответ дан 26 November 2019 в 20:22
поделиться

Если бы вы сегодня писали новое приложение с нуля и хотели, чтобы оно масштабировалось для всех ядер, вы могли бы использовать его завтра, что Вы бы выбрали модель / систему / язык / библиотеку параллельного программирования?

Возможно, сегодня наиболее широко применимыми являются очереди задач в стиле Cilk (теперь они доступны в .NET 4). Они отлично подходят для задач, которые можно решить с помощью «разделяй и властвуй» с предсказуемой сложностью для подзадач (таких как параллельное отображение и сокращение по сравнению с массивами, где сложность аргументов функции также известна как алгоритмы вроде быстрой сортировки), и это решает многие реальные проблемы.

Более того, это применимо только к архитектурам с разделяемой памятью, таким как современные многоядерные. Хотя я не верю, что эта базовая архитектура исчезнет в ближайшее время, я считаю, что в какой-то момент ее необходимо объединить с распределенным параллелизмом. Это будет либо в форме кластера из многоядерных процессоров на многоядерном ЦП с передачей сообщений между многоядерными процессорами, либо в форме иерархии ядер с предсказуемым временем связи между ними. Для достижения максимальной эффективности они потребуют существенно разных моделей программирования, и я не верю, что о них много известно.

1
ответ дан 26 November 2019 в 20:22
поделиться