0

次の形式の Parallel.ForEach 式を作成します。

    let low = max 1 (k-m)
    let high = min (k-1) n
    let rangesize = (high+1-low)/(PROCS*3)

    Parallel.ForEach(Partitioner.Create(low, high+1, rangesize), (fun j ->

            let i = k - j
            if x.[i-1] = y.[j-1] then
                a.[i] <- b.[i-1] + 1
            else 
                a.[i] <- max c.[i] c.[i-1] 
        )) |> ignore

エラーが表示されます: メソッド 'ForEach' に一致するオーバーロードがありません。しかし、私はParallel.ForEach<TSource>メソッド ( Partitioner<TSource>, Action<TSource>) を使用しており、それは私には正しいようです。何か不足していますか?

編集済み:以下のコードと同じ結果を得ようとしています(パーティショナーを使用していません):

let low = max 1 (k-m)
let high = min (k-1) n
let rangesize = (high+1-low)/(PROCS*3)

let A = [| low .. high |]
Parallel.ForEach(A, fun (j:int) ->

    let i = k - j
    if x.[i-1] = y.[j-1] then
        a.[i] <- b.[i-1] + 1
    else 
        a.[i] <- max c.[i] c.[i-1] 
    ) |> ignore
4

1 に答える 1

3

必要なすべての名前空間を開いていること、使用しているすべての値 ( lowhighおよびPROCS) が定義されていること、使用している名前の一部 ( などPartitioner) がコードによって誤って再定義されていないことを確認していますか?

このコードを使用して非常に単純な F# スクリプトを作成しましたが、問題なく動作しているようです (コードをリファクタリングして というパーティショナーを作成しましたpが、動作には影響しません)。

open System.Threading.Tasks
open System.Collections.Concurrent

let PROCS = 10
let low, high = 0, 100

let p = Partitioner.Create(low, high+1, high+1-low/(PROCS*3))
Parallel.ForEach(p, (fun j ->
    printfn "%A" j  // Print the desired range (using %A as it is a tuple)
)) |> ignore

jが実際には type のペアであることが重要です。そのint * intため、ボディが間違った方法で (たとえば としてint) 使用すると、エラーが発生します。その場合、型注釈を追加するjと、他の場所でより有用なエラーが発生します。

Parallel.ForEach(p, (fun (j:int * int) ->
    printfn "%d" j // Error here, because `j` is used as an int, but it is a pair!
)) |> ignore

つまりj、元の範囲内のすべての値に対して何かを実行したい場合は、次のように記述する必要があります。

Parallel.ForEach(p, (fun (loJ, hiJ) ->
  for j in loJ .. hiJ - 1 do // Iterate over all js in this partition
    printfn "%d" j           // process the current j
)) |> ignore

余談ですが、 の最後の引数Partitioner.Createは実際には次のようになるはずです。おそらく、値(high+1-low)/(PROCS*3)だけでなく、ステップの総数を分割したいでしょう。low

于 2013-04-25T23:46:40.760 に答える