I want to create a JIT GPU compiler. You give an F# function, and we JIT compile it. The key of JIT compiling is to be able to cache the compiling result. I tried to use the MethodInfo
as the caching key, but it won't work. It seems that F# compiler will make a copy of the function instead of referencing the origin function. Is there a way to suppress this behavior?
Here is a test code, ideally, it should be just compiled twice, but it did it 4 times.
let compileGpuCode (m:MethodInfo) =
printfn "JIT compiling..."
printfn "Type : %A" m.ReflectedType
printfn "Method: %A" m
printfn ""
"fake gpu code"
let gpuCodeCache = ConcurrentDictionary<MethodInfo, string>()
let launchGpu (func:int -> int -> int) =
let m = func.GetType().GetMethod("Invoke", [| typeof<int>; typeof<int> |])
let gpuCode = gpuCodeCache.GetOrAdd(m, compileGpuCode)
// launch gpuCode
()
let myGpuCode (a:int) (b:int) = a + 2 * b
[<Test>]
let testFSFuncReflection() =
launchGpu (+)
launchGpu (+)
launchGpu myGpuCode
launchGpu myGpuCode
Aucun commentaire:
Enregistrer un commentaire