YaccConstructor / Brahma.FSharp

F# quotation to OpenCL translator and respective runtime to utilize GPGPUs in F# applications.
http://yaccconstructor.github.io/Brahma.FSharp
Eclipse Public License 1.0
74 stars 17 forks source link

Translation error on DU case construction inside kernel #147

Open dpanfilyonok opened 1 year ago

dpanfilyonok commented 1 year ago

Describe the bug

Unhandled exception. Brahma.FSharp.OpenCL.Translator.InvalidKernelException: Seems, that you try to use variable with name "rightItem", that declared out of quotation. Please, pass it as quoted function's p
arametaer.
   at Brahma.FSharp.OpenCL.Translator.Body.f@53-67[a](FSharpVar var, FSharpOption`1 _arg31)
   at Brahma.FSharp.OpenCL.Translator.Body.translateVar@377-2.Invoke(TranslationContext`2 state)
   at Brahma.FSharp.OpenCL.Translator.StateUtils.op_GreaterGreaterEquals@82-2.Invoke(a state)
   at Brahma.FSharp.OpenCL.Translator.Body.translateAsExpr@372-1.Invoke(TranslationContext`2 state)
   at Brahma.FSharp.OpenCL.Translator.Body.structArgs@774.Invoke(State`2 arg10@)
   at Microsoft.FSharp.Primitives.Basics.List.map[T,TResult](FSharpFunc`2 mapping, FSharpList`1 x) in D:\workspace\_work\1\s\src\fsharp\FSharp.Core\local.fs:line 248
   at Microsoft.FSharp.Collections.ListModule.Map[T,TResult](FSharpFunc`2 mapping, FSharpList`1 list) in D:\workspace\_work\1\s\src\fsharp\FSharp.Core\list.fs:line 75
   at Brahma.FSharp.OpenCL.Translator.Body.f@53-125(UnionCaseInfo unionCaseInfo, FSharpList`1 exprs, TranslationContext`2 _arg89, Type`1 _arg90)
   at Brahma.FSharp.OpenCL.Translator.Body.translate@766-69.Invoke(TranslationContext`2 state)
   at Brahma.FSharp.OpenCL.Translator.Body.translateAsExpr@372-1.Invoke(TranslationContext`2 state)
   at Brahma.FSharp.OpenCL.Translator.Body.go@550-8.Invoke(TranslationContext`2 state)
   at Brahma.FSharp.OpenCL.Translator.StateUtils.op_GreaterGreaterEquals@82-2.Invoke(a state)
   at Brahma.FSharp.OpenCL.Translator.Body.translateAsExpr@372-1.Invoke(TranslationContext`2 state)
   at Brahma.FSharp.OpenCL.Translator.Body.translateBinding@119-1.Invoke(TranslationContext`2 state)
   at Brahma.FSharp.OpenCL.Translator.Body.translateLet@612-4.Invoke(TranslationContext`2 state)
   at Brahma.FSharp.OpenCL.Translator.Body.translateSeq@514-10.Invoke(TranslationContext`2 state)
   at <StartupCode$Brahma-FSharp-OpenCL-Translator>.$StateBuilder.While@78-1.Invoke(state context)
   at Brahma.FSharp.OpenCL.Translator.Body.translateSeq@512-9.Invoke(TranslationContext`2 context)
   at Brahma.FSharp.OpenCL.Translator.StateUtils.op_GreaterGreaterEquals@82-2.Invoke(a state)
   at Brahma.FSharp.OpenCL.Translator.State.using@39.Invoke(a state)
   at Brahma.FSharp.OpenCL.Translator.Body.translateLet@634-18.Invoke(TranslationContext`2 state)
   at <StartupCode$Brahma-FSharp-OpenCL-Translator>.$Methods.TranslateBody@43-2.Invoke(TranslationContext`2 state)
   at <StartupCode$Brahma-FSharp-OpenCL-Translator>.$Methods.Translate@75-5.Invoke(TranslationContext`2 state)
   at Brahma.FSharp.OpenCL.Translator.FSQuotationToOpenCLTranslator.translate(FSharpExpr expr)
   at Brahma.FSharp.OpenCL.Translator.FSQuotationToOpenCLTranslator.Translate(FSharpExpr qExpr)

To Reproduce

let right (opAdd: Expr<'a option -> 'b option -> 'c option>) =
    <@
        fun (rightItem: 'b) ->
            (%opAdd) None (Some rightItem)
    @>

let preparePositionsGeneral (rightRead: Expr<'b -> 'c option>) =
    <@
        fun (ndRange: Range1D)
            (length: int)
            (rightValues: ClArray<'b>) ->

        let gid = ndRange.GlobalID0

        if gid < length  then
            let b = (%rightRead) rightValues.[gid]
            ()
    @>

let preparePositions opAdd =
    preparePositionsGeneral (right opAdd)

let translator = FSQuotationToOpenCLTranslator.CreateDefault()
translator.Translate (preparePositions StandardOperations.float32Sum)
|> fst
|> AST.print
|> printfn "%A"

Workarounds To use following function instead

let right (opAdd: Expr<'a option -> 'b option -> 'c option>) =
    <@
        fun (rightItem: 'b) ->
            let tmp = Some rightItem
            (%opAdd) None tmp
    @>

Additional context