DeviceSumModuleF32已损坏

时间:2015-11-30 18:30:20

标签: aleagpu

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完全没问题。

See this post.

编辑:我应该写的不是崩溃,而是进入无限循环。对不起。

1 个答案:

答案 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
);