1

は、私は、以下の発表を読んでいた。マップ関数が本質的に並行しているのはなぜですか?

http://www.idt.mdh.se/kurser/DVA201/slides/parallel-4up.pdf

と著者はマップ機能は、並列処理のために非常によく構築されていると主張する(特に彼は、3ページまたはスライド9と10の彼の主張をサポートしています)。

リストの各値を+1ずつ増やすという問題があった場合、リストをルーピングすることによってインデックス値が変更され、競合状態の問題が発生する可能性があります。しかし、私は、マップ関数がプログラマがうまく並行してコード化できるようにする方法が不思議です。

マップが再帰的に定義されているためですか?したがって、各関数呼び出しを別のスレッドにスローすることはできますか?

私は誰かがいくつかの詳細を提供できることを願って、ありがとう!

+0

が入力リストの要素は、他のアプリケーションから他の要素への*独立*なので、すべて互いに独立して、つまり並列に実行できます。仮引数 'par_map'は、結果のリストを返すために記憶域を割り当て、リスト内の各要素' e'に対して新しいスレッドの実行を促し、更新される必要のある場所への参照を ' 。アクティブなスレッドがなくなると 'map'が終了します。もちろん、各スレッドが1000の 'e'sのブロックで動作するようにすることもできます。 –

答えて

3

map関数は、同じ純関数をコレクション内の要素nに適用し、結果を集計します。定義によると、関数の戻り値は純粋に入力に依存するため、関数をコレクションのメンバーに適用する順序は関係ありません。

+0

そうですが、リストを別々のチャンクに分割して、各チャンクをそれ自体のスレッドでループで必須に処理することはできませんか?それはどのように上記と異なるでしょうか? –

+0

おそらく機能的に何もない...私はそれが単なる複雑さの問題だと思う。あなたが記述しているアルゴリズムはより複雑になりますが、ライブラリを利用してパラレルマップを実行するだけでも構いません。少なくとも私は彼の意見をどのように解釈するのですか。 –

+0

私は地図の内部にもっと興味があったと思います。もしマップが再帰的に定義されていれば、map(f(x)、list)= listが空の場合はmap(f(x)、list.tail)とf(head_of_list) mapが再帰的に定義されている場合、マップはf(head_of_list)を順番に計算するのを避けるためにどのようにしていますか? (ループのように) –

3

すでに他の人は標準mapの実装が並行ではないと説明しました。

しかし、あなたはそれをタグ付けするのでScalaで、あなたは単に

val list = ... // some list 
list.par.map(x => ...) // instead of list.map(x => ...) 

として並列バージョンを取得することができますがscala.collection.parallelパッケージでParIterableや他のタイプのためにもParallel Collections Overviewやドキュメントを参照してください。

あなたは(def mapclass Mapを探して)したい場合は、https://github.com/scala/scala/blob/v2.12.1/src/library/scala/collection/parallel/ParIterableLike.scalaに並列mapの実装を見つけることができます。それは非常に重要ではないインフラストラクチャを必要とし、確かにシーケンシャルmapの再帰的定義を取ってそれを並列化するだけではありません。

ループを介してマップを定義していた場合、どのように破壊されますか?

ループあるスライドが終わりに、一例として、F#の平行アレイを与え、https://github.com/fsharp/fsharp/blob/master/src/fsharp/FSharp.Core/array.fs#L266であなたは非平行の実装を見ることができます:機能の各アプリケーションは `にF`ため

let inline map (mapping: 'T -> 'U) (array:'T[]) = 
    checkNonNull "array" array    
    let res : 'U[] = Microsoft.FSharp.Primitives.Basics.Array.zeroCreateUnchecked array.Length 
    for i = 0 to res.Length-1 do 
     res.[i] <- mapping array.[i] 
    res 
+0

Alexeyに感謝します。あなたはマップの標準的な再帰的な定義を呼び出しますか?ループを介してマップを定義していた場合、どのように破壊されますか? (私はこれらの質問に対する答えが1つのコメントよりも大きいかもしれないと思うが、どんな高レベルの概要も素晴らしいだろう!) –

+0

いいえ、それは必須ではなく、特に関連性はありません。スライドは再帰的実装について全く話していませんが、 'map'の仕様についてはパラレルに実装することはできません。 –

+0

2番目の質問に対する回答の編集を参照してください。 –

関連する問題