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>Method ( 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

你确定你已经打开了所有必要的命名空间,你正在使用的所有值(lowhighPROCS都被定义了,并且你的代码不会意外地重新定义你正在使用的一些名称(比如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,因此如果主体以错误的方式使用它(例如作为 an 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 回答