.NET Framework запускает некоторый код на GPU от моего имени - PullRequest
0 голосов
/ 27 февраля 2019

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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...