.NET Framework代表我在GPU上运行一些代码

时间:2019-02-27 15:18:45

标签: c# .net gpgpu

嗨,

我目前正在查看一些需要优化的代码。在调查中,我发现某些级别需要几分钟的时间来处理,而另一些则需要几个小时。 (所有级别在大小/对象和点数上都是等效的)。注意到这一点,我寻找答案,发现在处理快速级别时,GPU的使用率高达30%,而对于其他级别,则不使用GPU。

该代码用c#编写,并使用NetTopologySuite进行几何运算(如果有帮助的话)。我没有使用任何库在GPU上显式运行代码,所以我不明白为什么某些级别使用GPU(即使这对我来说更好)。我的研究表明,PLink仅使用CPU内核,我无法想象Windows可以自己决定在GPU上而不是CPU上运行某些代码(不是相同的指令,等等)。 进一步的调查显示,即使在较快的级别下,在最初的几秒钟(10-20秒)内也不会使用GPU。 从上一点开始,因为它取决于级别,所以我猜想这是.NET框架(基于有关循环的第一次迭代的一些统计信息)做出的与运行时相关的决定。 所以这是我的问题:我的推论正确吗?我可以影响在CPU和GPU之间调度代码执行的方式吗?

感谢您的帮助,如有需要,请随时询问更多详情。

private void ProcessLevels(){
    _indexList.ForEach(i => ProcessLevel(levels[i]);
}

private void ProcessLevel(MyLevel level){
   level.RetrieveLotsOfObjects()
        .WhereNotNull()
        .AsParallel()
        .WithDegreeOfParallelism(n)
        .ForAll(o =>
                {
                     PerformComputation(o)
                });
}

private void PerformComputation(MyObject o){
    var pointsStatus = o.GetPointsStatus();
    ConcurrentBag<Points> safePoints = new ConcurrentBag<Points>();
    foreach (var pS in pointsStatus){
       if(pS.Status == Status.OK)
              safePoints.Add(pS.obj);
       else if (pS.Status == Status.Conflict)
              _suspiciousPoints.Add(pS.pt);
    }

    foreach (var point in safePoints){
        PerformGeometryOps(safePoints);
    }
}

0 个答案:

没有答案