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

Segmentation fault on boolean kernels #116

Closed dpanfilyonok closed 2 years ago

dpanfilyonok commented 3 years ago

Describe the bug Exception when running simple kernel on bool.

Fatal error. System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
   at OpenCL.Net.Cl.clCreateBuffer(IntPtr, OpenCL.Net.MemFlags, IntPtr, IntPtr, OpenCL.Net.ErrorCode ByRef)
   at OpenCL.Net.Cl.clCreateBuffer(IntPtr, OpenCL.Net.MemFlags, IntPtr, IntPtr, OpenCL.Net.ErrorCode ByRef)
   at OpenCL.Net.Cl.CreateBuffer(OpenCL.Net.Context, OpenCL.Net.MemFlags, IntPtr, IntPtr, OpenCL.Net.ErrorCode ByRef)
   at OpenCL.Net.Cl.CreateBuffer(OpenCL.Net.Context, OpenCL.Net.MemFlags, IntPtr, System.Object, OpenCL.Net.ErrorCode ByRef)
   at Brahma.OpenCL.Commands.RunBase`1[[Brahma.OpenCL._1D, YC.Brahma.OpenCL, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null]].ArrayToMem(System.Object, System.Type)
   at Brahma.OpenCL.Commands.RunBase`1[[Brahma.OpenCL._1D, YC.Brahma.OpenCL, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null]].ToIMem(System.Object)
   at Brahma.OpenCL.Commands.RunBase`1[[Brahma.OpenCL._1D, YC.Brahma.OpenCL, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null]].SetupArgument(System.Object, Int32, System.Object)
   at DynamicClass.lambda_method(System.Runtime.CompilerServices.Closure, Brahma.OpenCL.Commands.Run`1<Brahma.OpenCL._1D>, Int32, System.Object)
   at Microsoft.FSharp.Collections.ArrayModule.IterateIndexed[[System.__Canon, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]](Microsoft.FSharp.Core.FSharpFunc`2<Int32,Microsoft.FSharp.Core.FSharpFunc`2<System.__Canon,Microsoft.FSharp.Core.Unit>>, System.__Canon[])
   at DynamicClass.lambda_method(System.Runtime.CompilerServices.Closure, Microsoft.FSharp.Core.FSharpFunc`2<Int32,Microsoft.FSharp.Core.FSharpFunc`2<System.Object,Microsoft.FSharp.Core.Unit>>, System.Object[])
   at DynamicClass.lambda_method(System.Runtime.CompilerServices.Closure, Microsoft.FSharp.Core.Unit, Brahma.OpenCL._1D, Boolean[], Boolean[])
   at GraphBLAS.FSharp.Backend.Common.Copy+copyNonEmpty@28-1[[System.Boolean, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].Invoke(Microsoft.FSharp.Core.FSharpFunc`2<Brahma.OpenCL._1D,Microsoft.FSharp.Core.FSharpFunc`2<Boolean[],Microsoft.FSharp.Core.FSharpFunc`2<Boolean[],Microsoft.FSharp.Core.Unit>>>)
   at Brahma.FSharp.OpenCL.WorkflowBuilder.Basic+RunCommand@33-1[[Brahma.OpenCL._1D, YC.Brahma.OpenCL, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null],[System.__Canon, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].Invoke(OpenCLEvaluationContext)
   at Brahma.FSharp.OpenCL.WorkflowBuilder.Evaluation+Bind@64[[System.__Canon, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.__Canon, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].Invoke(OpenCLEvaluationContext)
   at Brahma.FSharp.OpenCL.WorkflowBuilder.Evaluation+Bind@64[[System.__Canon, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.__Canon, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].Invoke(OpenCLEvaluationContext)
   at Brahma.FSharp.OpenCL.WorkflowBuilder.Evaluation+Bind@64[[System.__Canon, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.__Canon, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].Invoke(OpenCLEvaluationContext)
   at Brahma.FSharp.OpenCL.WorkflowBuilder.Basic.OpenCLEvaluationContext.RunSync[[System.__Canon, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]](OpenCLEvaluationContext, OpenCLEvaluation`1<System.__Canon>)
   at Program.main(System.String[])
Segmentation fault

To Reproduce

module internal Utils =
    let defaultWorkGroupSize = 256

    let getDefaultGlobalSize n =
        let m = n - 1
        m - m % defaultWorkGroupSize + defaultWorkGroupSize

module internal rec Copy =
    let copyArray (inputArray: 'a[]) =
        if inputArray.Length = 0 then
            opencl { return [||] }
        else
            copyNonEmpty inputArray

    let private copyNonEmpty (inputArray: 'a[]) = opencl {
        let inputArrayLength = inputArray.Length
        let copy =
            <@
                fun (ndRange: _1D)
                    (inputArrayBuffer: 'a[])
                    (outputArrayBuffer: 'a[]) ->

                    let i = ndRange.GlobalID0
                    if i < inputArrayLength then
                        outputArrayBuffer.[i] <- inputArrayBuffer.[i]
            @>

        let outputArray = Array.zeroCreate inputArray.Length

        do! RunCommand copy <| fun kernelPrepare ->
            let ndRange = _1D(Utils.getDefaultGlobalSize inputArray.Length, Utils.defaultWorkGroupSize)
            kernelPrepare ndRange inputArray outputArray

        return outputArray
    }

[<EntryPoint>]
let main argv =
    opencl {
        let array = Array.create 100_000 true
        let! copied = Copy.copyArray array
        return array
    }
    |> OpenCLEvaluationContext().RunSync
    |> ignore

    0

Desktop (please complete the following information):