2015-11-30 192 views
0
let sumModule = (new DeviceSumModuleF32(GPUModuleTarget.Worker(worker))).Create(2e2 |> int) 

let t = worker.Malloc([|1.0f;1.0f;1.0f;1.0f;|]) 
let q = sumModule.Reduce(t.Ptr,4) 

沒有失敗,上面的代碼崩潰,最後一行每次運行的概率爲66%。我試過改變參數,但沒有區別。我認爲DeviceSumModuleF32可能被破壞。DeviceSumModuleF32被破壞

let sumModule = (new DeviceReduceModule<float32>(GPUModuleTarget.Worker(worker),<@ (+) @>)).Create(2e9 |> int) 

let t = worker.Malloc([|1.0f;1.0f;1.0f;1.0f;|]) 
let q = sumModule.Reduce(t.Ptr,4) 

上面的工作使用DeviceReduceModule雖然完美。

See this post.

編輯:我已經寫,而不是崩潰,它進入一個無限循環。對於那個很抱歉。

回答

0

我認爲這可能是配置GPU模塊的一個錯誤。這是一種解決方法,通過將CUDA上下文模式切換到「Threaded」,並嘗試使用「use」關鍵字來維護GPU模塊的生命週期(GPU模塊是編譯的結果,所以它應該保持活動狀態,只要可能會避免在運行時重新編譯)。

// workaround to use threaded cuda context mode 
Alea.CUDA.Settings.Instance.Worker.DefaultContextType <- "threaded" 
// compile GPU code and keep the module live for a long time 
use reduceModule = new DeviceReduceModule<float32>(GPUModuleTarget.Worker(worker),<@ (+) @>) 
// now get a reducer from reduce module. 
// this reduce object includes some temp memories for algorithm 
use reducer = reduceModule.Create(maxReduceNumber) 
reducer.Reduce(....) 
+0

沒有。嘗試將其切換到線程模式,並沒有幫助。儘管編寫了我自己的reduce模塊,但我已經解決了這個問題。 –