Hy,
В настоящее время я смотрю на некоторый код, который необходимо оптимизировать.Во время моих исследований я обнаружил, что для некоторых уровней требуется несколько минут, а для других - несколько часов.(Все уровни эквивалентны по размеру / количеству объектов и точек).Заметив это, я ищу ответы и выясняю, что при обработке быстрых уровней графический процессор используется до 30%, тогда как для остальных графический процессор не используется.
Код написан на c # и используюNetTopologySuite для геометрических операций (в случае, если это может помочь).Я не использую какую-либо библиотеку для явного запуска кода на GPU, поэтому я не понимаю, почему некоторые уровни используют GPU (даже если это лучше для меня).Мои исследования показывают, что PLink использует только ядра процессора, и я не могу себе представить, что Windows сама по себе может решить запустить некоторый код на GPU вместо CPU (не те же инструкции и т. Д.).Дальнейшие исследования показывают, что даже на быстрых уровнях графический процессор не используется в течение первых секунд (10-20 с).Из предыдущего пункта и потому, что это зависит от уровня, я полагаю, что это решение, зависящее от времени выполнения, принятое платформой .NET (основанной на некоторой статистике по первым итерациям цикла?).Итак, вот мои вопросы: мой вывод правильный?Могу ли я повлиять на способ выполнения кода между процессором и графическим процессором?
Спасибо за вашу помощь и не стесняйтесь спрашивать более подробную информацию, если это необходимо.
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);
}
}