2017-12-07 15 views
2

これはFle#でAlea GPUで可能ですか?Alea GPUカーネルに関数を渡す

機能を宣言します。

let my_function = fun a b -> a + b 

は機能カーネルを渡して、カーネル内でそれを使用する:

let result = my_function 5 9 

私は代替は、単に静的のような関数を宣言することであることを理解

[<ReflectedDefinition>] 
let my_function a b = 
    a + b 

しかし、変更できるようにしたいmy_function bプログラムのパラメータに依存します。例えば

[<ReflectedDefinition>] 
let kernel (a:int) (adder:int->int) = 
    let result <- adder a 

let transformKernel = <@ kernel @> |> Compiler.makeKernel 

let add_num b = 
    fun (a:int) -> 
     a + b 

let run num1 num2 = 
    let adder = add_num num2 
    let gpu = Gpu.Default 
    let num1Gpu = gpu.Allocate(num1) 
    let adderGpu = gpu.Allocate(adder) 
    let lp = LaunchParam(1, 1) 
    gpu.Launch transformKernel lp num1Gpu adderGpu 
    // return result 


let my_result = run 3 7 
// my_result should be 10 

答えて

0

私はAlea GPU sample galleryでこれに対する解決策を見つけました。私が見ることのできる最も簡単な例は、F#Generic Transformサンプルです。 code quotationsを使用して、特定の型の任意の関数(例えば、int - > int - > int)に基づいてカーネルをコンパイルします。

関連する問題