Многоядерное / параллельное программирование и .NET / Java

Я часто слышу о других языках, которые считаются более подходящими для многоядерного / параллельного программирования, например Clojure, Scala, Erlang и т. Д., Но я немного смущен тем, почему мне нужно беспокоиться о нескольких ядрах, разве виртуальная машина Java / .NET не должна обрабатывать это автоматически, а если нет, то каковы причины этого?

Причина в том, что упомянутые языки являются функциональными и имеют некоторое внутреннее преимущество перед нефункциональными языками?


person Eugene    schedule 16.08.2011    source источник


Ответы (4)


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

Некоторые люди предпочитают языки функционального стиля, такие как Scala, Erlang и F #, нефункциональным для многопоточного программирования. Функциональные языки, как правило, по умолчанию, по крайней мере, поверхностно неизменяемы, и, следовательно, теоретически с ними легче работать в многопоточных ситуациях.

Вот очень хорошая статья на эту тему

person JaredPar    schedule 16.08.2011

Функциональные языки имеют внутреннее преимущество, заключающееся в том, что большинство вызываемых функций / методов идемпотентны и что они обычно часто используют «неизменяемость».

Выполнять параллелизм при использовании неизменяемого «материала» намного проще, чем при использовании изменяемого «материала».

Но в любом случае: вам нужно беспокоиться о параллелизме, потому что мы собираемся использовать ЦП с все большим и большим количеством ядер, а не более быстрые и быстрые тактовые частоты. Java / C # не делают вашу программу автоматически согласованной: вам все равно придется выполнять тяжелую работу самостоятельно.

person SyntaxT3rr0r    schedule 16.08.2011

В случае с обычными императивными языками по умолчанию нет, вы не получите особой помощи от платформы. Ни один компилятор не настолько умен, чтобы распараллеливать обычный императивный код.

Однако существуют различные справочные библиотеки, которые могут помочь вам на разных платформах. Например, библиотека Task Parallel в .NET позволяет делать это, например:

Parallel.ForEach(files, file => 
{
   Process(file);
});

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

person Anders Forsgren    schedule 16.08.2011

Я никогда не программировал функциональные языки, но предполагается, что их будет проще кодировать одновременно, поскольку состояния не меняются (или не сильно меняются), так что вы можете иметь один и тот же объект в двух потоках одновременно. Если у вас есть один и тот же объект в двух потоках одновременно в Java, вы должны быть очень осторожны и использовать некоторые специальные конструкции синхронизации, чтобы два потока могли «видеть» объект в одном и том же состоянии, когда это необходимо.

Текущая проблема в программировании состоит в том, что все привыкли делать что-то последовательно, но оборудование движется в многоядерном режиме. В том, как мы программируем и думаем о коде, должен произойти полный сдвиг парадигмы. Прямо сейчас кодирование для многоядерных процессоров на Java или C # - это, по сути, просто последовательное кодирование с хаками, чтобы сделать его распараллеливаемым. Окажется ли функциональное программирование необходимым сдвигом парадигмы? Я не знаю.

person toto2    schedule 16.08.2011