Почему параллельный haskell недетерминирован, а параллельные примитивы haskell (par и pseq) детерминированы?

Не совсем понимаю детерминизм в контексте параллелизма и параллелизма в Haskell. Некоторые примеры были бы полезны. Спасибо




Ответы (2)


При работе с чистыми значениями порядок оценки не имеет значения. По сути, это то, что делает parallelism: параллельная оценка чистых значений. В отличие от чистых значений порядок обычно имеет значение для действий с побочными эффектами. Одновременное выполнение действий называется параллельным доступом.

В качестве примера рассмотрим два действия putStr "foo" и putStr "bar". В зависимости от порядка, в котором оцениваются эти два действия, результатом будет либо «foobar», «barfoo», либо любое промежуточное состояние. Вывод недетерминирован, поскольку он зависит от конкретного порядка оценки.

В качестве другого примера рассмотрим два значения sum [1..10] и 5 * 3. Независимо от порядка, в котором оцениваются эти два параметра, они всегда приводят к одним и тем же результатам. Этот детерминизм обычно можно гарантировать только с чистыми значениями.

person fuz    schedule 20.12.2011
comment
+1; другими словами, параллелизм — это оптимизация; параллелизм изменяет семантику. - person ehird; 21.12.2011
comment
В lang oz: 1 значение потока данных может быть привязано только один раз, 2 программа использует значение отмены привязки, которое должно ждать, пока оно не будет привязано. Таким образом, поведение является детерминированным, когда два потока используют одно и то же значение потока данных. - person jiamo; 24.04.2014

Параллелизм и параллелизм - разные вещи.

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

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

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

person hammar    schedule 20.12.2011