スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

F#による並行プログラミング入門(11) PLINQ ForAll

 Parallel.ForやParallel.ForEachに対応するPLINQのメソッドはForAllです。今回はこのメソッドの紹介からです。 
 
シグネチャーは次のようになります。 
 
static member ForAll :  
        source:ParallelQuery<'TSource> *  
        action:Action<'TSource> -> unit  
 
いつも通りの時間だけかかる無意味関数を定義しておきます。 
 
> let longTaskSub r =  
    let res = ref 0  
    for i in 1 .. 100000 do  
      for j in 1 .. 1000*r do  
         res := !res + 1  
    printfn "引数%3dに対しlongTaskSubの計算が終了" r 
    !res  
 
let doWork i = 
    longTaskSub i |> ignore;; 
 
val longTaskSub : int -> int 
val doWork : int -> unit 
 
 
PLINQを用いて1から100までの数に対してdoWorkを呼び出してみます。 
 
> open System.Collections.Concurrent 
open System.Linq;; 
 
> System.Linq.ParallelEnumerable.ForAll((seq{1 .. 100}).AsParallel() ,(fun i -> doWork i)) 
;; 
引数  2に対しlongTaskSubの計算が終了 
引数  4に対しlongTaskSubの計算が終了 
引数  3に対しlongTaskSubの計算が終了 
引数  1に対しlongTaskSubの計算が終了 
引数  6に対しlongTaskSubの計算が終了 
引数  5に対しlongTaskSubの計算が終了 
以下略 
 
インスタンスメソッドとしても呼び出せます。 
 
> (seq{1 .. 100}).AsParallel().ForAll(fun i -> doWork i);; 
引数  3に対しlongTaskSubの計算が終了 
引数  1に対しlongTaskSubの計算が終了 
引数  4に対しlongTaskSubの計算が終了 
引数  2に対しlongTaskSubの計算が終了 
以下略 
 
PLINQでは通常並列化するかどうかはシステム任せなのですが、強制的に並列実行するように指定することもできます。これにはWithExcutionModeメソッドを用います。シグネチャーは次の通りです。 
 
static member WithExecutionMode :  
        source:ParallelQuery<'TSource> *  
        executionMode:ParallelExecutionMode -> ParallelQuery<'TSource>  
         
 
引数のタプル内のSystem.Linq.ParallelExecutionModeはクエリの実行モードで、強制的に並列実行するには、ここにParallelExcutionMode.ForceParallelismを渡します。 
 
では強制並列実行してみます。 
 
> ParallelEnumerable.ForAll([1 .. 100].AsParallel().WithExecutionMode(System.Linq.ParallelExecutionMode.ForceParallelism) ,fun i -> doWork i) 
;; 
実行結果略 
 
もしくは(ふつうはこっちを使いますが) 
 
> [1 .. 100].AsParallel().WithExecutionMode(System.Linq.ParallelExecutionMode.ForceParallelism).ForAll(fun i -> doWork i);; 
 
実行結果略 
 
PLINQではでは固定された並列化数で仕事をこなします。デフォルトではコア数ですがWithDegreeOfParallelismメソッドを利用するとこのスレッド数を指定できます。シグネチャーは次の通りです。 
 
static member WithDegreeOfParallelism :  
        source:ParallelQuery<'TSource> *  
        degreeOfParallelism:int -> ParallelQuery<'TSource>  
 
では並列化数を2にして実行してみます。 
 
> [1 .. 100].AsParallel().WithDegreeOfParallelism(2).ForAll(fun i -> doWork i);; 
 
ここで留意事項ですが、WithExecutionModeメソッドにしても、WithDegreeOfParallelismにしても返り値はParallelQuery<_>型なので、ドットでつないでいくことができます。 
 
例 
 
> [1 .. 100].AsParallel().WithExecutionMode(ParallelExecutionMode.ForceParallelism).WithDegreeOfParallelism(2).ForAll(fun i -> doWork i) 
;; 
実行結果略
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

Author:T GYOUTEN
F#と英単語とフリーソフトと読書に興味があります。
ホームページでフリーソフトも公開しています。どぞ御贔屓に。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
フリーエリア
フリーエリア
blogram投票ボタン
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。