嗨,
我目前正在查看一些需要优化的代码。在调查中,我发现某些级别需要几分钟的时间来处理,而另一些则需要几个小时。 (所有级别在大小/对象和点数上都是等效的)。注意到这一点,我寻找答案,发现在处理快速级别时,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);
}
}