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完全没问题。
编辑:我应该写的不是崩溃,而是进入无限循环。对不起。
答案 0 :(得分:0)
我认为这可能是处理GPU模块的一个错误。这是一种解决方法,通过将CUDA上下文模式切换为&#34; Threaded&#34;,并尝试使用&#34;使用&#34;用于维护GPU模块生命周期的关键字(GPU模块是编译的结果,因此应尽可能保持活动状态以避免在运行时重新编译)。
Task.Factory.StartNew(() =>
{
Index.ResourceIndexDocument document = null;
while (this.documents.TryTake(out document, TimeSpan.FromSeconds(1)))
{
IEnumerable<Index.ResourceIndexDocument> documents = this.documents.Take(this.documents.Count);
Index.IndexEngine.Instance.index(documents);
}
},
TaskCreationOptions.LongRunning
);