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
答案 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。