Когда параллелизм Erlang преодолевает свои слабые места в числовых вычислениях?

Дженерики Java в широком масштабе отличающиеся от шаблонов C++.

В основном в шаблонах C++ в основном прославленный набор препроцессора/макроса ( Примечание: , так как некоторые люди кажутся не могущими постигать аналогию, я не говорю, что шаблонная обработка является макросом). В Java они - в основном синтаксический сахар для уменьшения шаблонного кастинга Объектов. Вот довольно достойное введение в шаблоны C++ по сравнению с дженериками Java .

Для разработки по этому вопросу: при использовании шаблона C++ Вы в основном создаете другую копию кода, так же, как если бы Вы использовали #define макрос. Это позволяет Вам делать, вещам нравится, имеют int параметры в шаблонных определениях, которые определяют размеры массивов и такого.

Java не работает как этот. В Java вся степень объектов от [1 111] java.lang. Объект так, предварительные дженерики, Вы написали бы код как это:

public class PhoneNumbers {
  private Map phoneNumbers = new HashMap();

  public String getPhoneNumber(String name) {
    return (String)phoneNumbers.get(name);
  }

  ...
}

, потому что все типы набора Java используемый Объект как их базовый тип, таким образом, Вы могли поместить что-либо в них. Java 5 катается вокруг и добавляет дженерики, таким образом, можно сделать вещи как:

public class PhoneNumbers {
  private Map phoneNumbers = new HashMap();

  public String getPhoneNumber(String name) {
    return phoneNumbers.get(name);
  }

  ...
}

И это - все Дженерики Java: обертки для кастинга объектов. Поэтому Дженерики Java не усовершенствованы. Они используют стирание типа. Это решение было принято, потому что Дженерики Java пришли настолько поздно в части, что они не хотели повреждаться, обратная совместимость (Map применимо каждый раз, когда Map требуется). Сравните это с.Net/C#, где стирание типа не используется, который приводит ко всем видам различий (например, можно использовать типы примитивов и IEnumerable и IEnumerable перенос никакое отношение друг к другу).

И класс с помощью дженериков, скомпилированных с Java 5 +, компилятор применим на JDK 1.4 (предполагающий, что он не использует никакие другие функции или классы, которые требуют Java 5 +).

Вот почему Дженерики Java называют синтаксический сахар .

, Но это решение о том, как сделать, дженерики имеют сильные воздействия так так, чтобы (превосходный) дженерики FAQ Java возникли для ответа на многих, многие люди вопросов имеют о Дженериках Java.

шаблоны C++ имеют много функций, которые не делают Дженерики Java:

, Например:

public class ObservableList {
  ...
}

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

Кроме различий с дженериками, для полноты, вот основное сравнение C++ и Java другой ).

И я могу также предложить Взгляды в Java. Как программист на C++ много понятий как объекты уже будет второй натурой, но существуют тонкие различия, таким образом, может стоить иметь вводный текст, даже если Вы просматриваете части.

Многое из того, что Вы изучите при изучении Java, является всеми библиотеками (и стандарт - что прибывает в JDK - и нестандартный, который включает наиболее часто используемые вещи как Spring). Синтаксис Java является более подробным, чем синтаксис C++ и не имеет большого количества функций C++ (например, перегрузка оператора, множественное наследование, механизм деструктора, и т.д.), но это строго не делает это подмножеством C++ также.

36
задан 7 revs, 3 users 100% 20 August 2009 в 20:42
поделиться

5 ответов

Было бы ошибкой думать о параллелизме только как о мощи обработки простых чисел. Erlang ближе к тому, как работает кластерный компьютер, чем, скажем, графический процессор или классический суперкомпьютер.

В современных графических процессорах и суперкомпьютерах старого образца производительность зависит от векторизованной арифметики, специального вычислительного оборудования и связи с малой задержкой. между процессорами. Поскольку задержка связи мала, а каждый отдельный вычислительный блок работает очень быстро, идеальный вариант использования - загрузить в ОЗУ машины данные и заставить ее обработать все сразу. Эта обработка может включать в себя передачу большого количества данных между узлами, как это происходит при обработке изображений или 3D, где необходимо выполнить множество задач, связанных с процессором, для преобразования данных из формы ввода в форму вывода. Этот тип машины - плохой выбор, если вам часто приходится обращаться к диску, сети или другому медленному каналу ввода-вывода для данных. Это простаивает по крайней мере один дорогостоящий специализированный процессор и, вероятно, также блокирует конвейер обработки данных, так что больше ничего не делается.

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

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

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

поэтому каждый куб постоянно общается со своими 6 соседними соседями. (Воздух не проходит через края или углы куба, будучи бесконечно тонким, поэтому он не разговаривает с другими 20 соседними кубами.) Запустите это в кластере, независимо от того, работает ли на нем Erlang или какая-либо другая система, и он мгновенно становится привязанным к вводу-выводу.

поэтому каждый куб постоянно общается со своими 6 соседними соседями. (Воздух не проходит через края или углы куба, будучи бесконечно тонким, поэтому он не разговаривает с другими 20 соседними кубами.) Запустите это в кластере, независимо от того, работает ли на нем Erlang или какая-либо другая система, и он мгновенно становится привязанным к вводу-выводу.

47
ответ дан 27 November 2019 в 05:40
поделиться

Практически любой язык можно распараллелить. На некоторых языках это просто, на других - заноза в заднице, но это можно сделать. Если вы хотите запустить программу на C ++ на 8000 ЦП в сетке, вперед! Вы можете сделать это. Это было сделано и раньше.

Erlang не делает ничего невозможного в других языках. Если один ЦП, выполняющий программу на Erlang, менее эффективен, чем тот же ЦП, выполняющий программу на C ++, то двести ЦП, выполняющие программу на Erlang, также будут медленнее, чем две сотни ЦП, работающих на C ++.

Что делает Erlang . упрощает работу с подобным параллелизмом . Это экономит время разработчика и снижает вероятность ошибок.

Так что я скажу нет, не существует переломного момента, когда Erlang ' Параллелизм позволяет ему превзойти возможности другого языка по вычислительной мощности.

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

И, конечно же, давайте не будем забывать старый добрый момент, что языки не делают » t имеют скорость . Достаточно хороший компилятор Erlang дал бы идеально оптимальный код. Достаточно плохой компилятор C даст код, который работает медленнее, чем что-либо еще.

10
ответ дан 27 November 2019 в 05:40
поделиться

Есть ли переломный момент, когда сила Эрланга преодолевает его локальную слабость в скорости?

Ну, конечно, есть. Например, при попытке найти медиану триллиона чисел :):

http://matpalm.com/median/question.html

Незадолго до того, как вы написали, я заметил, что это был пост номер 1 на erlang.reddit.com.

12
ответ дан 27 November 2019 в 05:40
поделиться

Есть необходимость заставить Erlang быстрее выполнять числовой код. Компилятор HiPe компилируется в собственный код вместо, например, байт-кода BEAM, и, вероятно, имеет наиболее эффективную оптимизацию для кода с плавающей запятой, где он может избежать боксов. Это очень полезно для кода с плавающей запятой, поскольку он может хранить значения непосредственно в регистрах FPU.

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

Теперь, когда серверы со 128 ГБ ОЗУ не так уж редки, и нет причин, по которым они получат еще больше памяти, некоторые проблемы, связанные с вводом-выводом, могут переходить в некоторую зависимость от ЦП. Это может быть драйвер.

Вы должны следовать HiPe в разработке.


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

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

Лучшая архитектура для задач с высокой степенью распараллеливания - это графические процессоры. Для программирования графических процессоров на функциональном языке я вижу лучший потенциал в использовании Haskell для создания программ, нацеленных на них. Графический процессор - это в основном чистая функция от входных данных до выходных данных. См. Проект Lava в Haskell для создания схем FPGA, если возможно создать схемы так чисто в Haskell, не может быть труднее создавать программные данные для графических процессоров.

Архитектура Cell очень хороша. также хорошо подходит для векторизуемых задач.

6
ответ дан 27 November 2019 в 05:40
поделиться

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

Это о том, как выразить алгоритмы или программы, в которых последовательность действий является частичной - заказано.

1
ответ дан 27 November 2019 в 05:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: