лучший способ суммировать элементы матрицы параллельно в C # - PullRequest
1 голос
/ 14 декабря 2010

Какой самый быстрый и эффективный способ суммирования всех матричных элементов параллельно в .net 4.0?

с использованием Parallel.For для завершения во внутреннем цикле блокировки (objectLock) {result + = matrix [i, j]} в 2 раза медленнее, чем последовательный подход.

спасибо за любые подсказки, пока

Ответы [ 3 ]

2 голосов
/ 14 декабря 2010

ParallelEnumerable.Sum знает, как сделать сумму, не требуя операций блокировки или блокировки (я предполагаю, что она суммирует подмножества в каждом потоке, а затем суммирует эти результаты).матрица IEnumerable<IEnumerable<numeric>>:

var sum = (from row in matrix.AsParallel()
           select row.Sum()).Sum();

AsParallel означает, что строки обрабатываются параллельно, но внутренняя сумма (столбец) равна Enumerable.Sum (если строки не очень длинные, издержки параллелизма сократят любые возможные выгоды).

1 голос
/ 14 декабря 2010

Ну, вы можете рассмотреть ваши массивы martrix [m, n] в m, длина которых равна n, а затем суммировать m массивов параллельно. И, кстати, вы не должны использовать lock здесь, вместо этого используйте Interlocked.Add. Я сейчас занят, напишу пример, если у меня будет время.

0 голосов
/ 14 декабря 2010

Используйте статические переменные для i, j и результат без блокировки

...