Параллельный расчет C # - PullRequest
       14

Параллельный расчет C #

0 голосов
/ 21 сентября 2018

Я пишу нейронную сеть и хочу оптимизировать циклы для повышения эффективности.Я хотел бы рассчитать в параллельном режиме, если это возможно, но у меня есть проблема.

Моя первая проблема, как я могу использовать LINQ?Это то, что я пытаюсь.

var tmp = 
     (
         from j in Enumerable.Range(0, X.Length)
         select W[i, j] += learningRate * Error[i] * X[j]
     ).AsParallel().ToArray();

Это действительно увеличит эффективность?

Во-вторых, лучше ли будет использовать Parallel.For для усвоения циклов?

Я надеюсь, вы понимаете, что я хочу :)

PS Это хороший способ использовать Parallel.For для внешнего цикла и LINQ для внутреннего?Потому что, если я использую два Parallel.For цикла, я получаю неправильные результаты.

1 Ответ

0 голосов
/ 21 сентября 2018

Глядя на ваш код, если бы я хотел получить потенциальные преимущества параллельной работы, я бы изменил его на

Enumerable.Range(0, X.Length)
    .AsParallel()
    .Select((i, j) => new { i, j, X = W[i, j] + learningRate * Error[i] * X[j] })
    .ForAll(d => W[d.i, d.j] = d.X);

или, альтернативно,

Enumerable.Range(0, X.Length)
    .AsParallel()
    .Select((i, j) => new { i, j })
    .ForAll(d => W[d.i, d.j] += learningRate * Error[d.i] * X[d.j]);

или дажеПроще говоря, переопределите W с одним измерением, ваш текущий код в любом случае будет следовать по прямой диагонали и выполните

Enumerable.Range(0, X.Length)
    .AsParallel()
    .ForAll(i => W[i] += learningRate * Error[i] * X[i]);

Важным моментом является вызов AsParallel перед операциейчто вы хотите выполнять параллельно.Создание параллельного массива не имеет особого смысла, независимо от того, нужен он вам или нет.

Однако, поскольку выполняемая операция не занимает много времени, я сомневаюсь, что вы получите много пользы от использования PLINQ.Как отмечается в многочисленных комментариях, единственный способ тестирования - это тестирование производительности в режиме выпуска на типичном оборудовании.

Я подозреваю, что вы получите больше пользы, превратив W в зубчатый массив (W[][]).) вместо многомерного массива (W[,]), но, опять же, для этого потребуется тестирование производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...