FSCL中的简单添加不会更新结果数组

时间:2015-11-04 05:09:59

标签: f# opencl

open FSCL
open FSCL.Compiler
open FSCL.Language
open FSCL.Runtime

[<ReflectedDefinition; Kernel>]
let SimpleAdd(a: float32[], b: float32[], c: float32[], wi: WorkItemInfo) =
    let i = wi.GlobalID(0)

    c.[i] <- a.[i] + b.[i]


[<EntryPoint>]
let main argv =
    let a = [| 1.0f; 2.0f |]
    let b = [| 2.0f; 3.0f |]
    let c = Array.zeroCreate 2
    let workItem = WorkSize(a.LongLength)
    <@ SimpleAdd(a, b, c, workItem) @>.Run() |> ignore
    printfn "%A" c
    0 

输出[| 0.0F; 0.0f |]

我正在使用VS2015附带的F#编译器。控制台应用程序针对.NET 4.5.1上的F#4.0

更新

奇怪的是,这可以解决问题:

[<ReflectedDefinition; Kernel>]
let SimpleAdd(a: float32[], b: float32[], wi: WorkItemInfo) =
    let i = wi.GlobalID(0)
    let c = Array.zeroCreate a.Length

    c.[i] <- a.[i] + b.[i]

    c

1 个答案:

答案 0 :(得分:0)

第二个示例正在工作,因为F#函数中的最后一个表达式是函数的返回值。

第一个示例不起作用 因为F#引用增加了另一个抽象层次。

它的引用看起来像这样

val x : Quotations.Expr<unit> =
  Call (None, SimpleAdd,
      [PropertyGet (None, a, []), 
       PropertyGet (None, b, []),
       PropertyGet (None, c, []), Value (1)])

这不允许(或取决于引用的评估实现)数组(.NET引用类型)的突变对接口的副作用。

您可以在此处查看编译器实现https://github.com/FSCL/FSCL.Compiler 或者联系FSCL的作者gabry.cocco@gmail.com。