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 可能坏了。

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 非常好。

看到这个帖子。

编辑:我应该写它不是崩溃,而是进入无限循环。对于那个很抱歉。

4

1 回答 1

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(....)
于 2015-12-03T16:27:24.450 回答