Глядя на ваш код, если бы я хотел получить потенциальные преимущества параллельной работы, я бы изменил его на
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[,]
), но, опять же, для этого потребуется тестирование производительности.