Умножение матриц? - PullRequest
       9

Умножение матриц?

0 голосов
/ 18 мая 2011

То, что я пытаюсь здесь, это умножение двух матриц двойных 500x500. И я получаю исключение нулевой ссылки!

Не могли бы вы взглянуть на это

void Topt(double[][] A, double[][] B, double[][] C) {
    var source = Enumerable.Range(0, N);
    var pquery = from num in source.AsParallel()
                    select num;
    pquery.ForAll((e) => Popt(A, B, C, e));
}

void Popt(double[][] A, double[][] B, double[][] C, int i) {
    double[] iRowA = A[i];
    double[] iRowC = C[i];
    for (int k = 0; k < N; k++) {
        double[] kRowB = B[k];
        double ikA = iRowA[k];
        for (int j = 0; j < N; j++) {
            iRowC[j] += ikA * kRowB[j];
        }
    }
}

Заранее спасибо

1 Ответ

1 голос
/ 18 мая 2011

Поскольку ваша проблема с нулевым указателем уже решена, почему бы не маленький совет по производительности;) Одна вещь, которую вы могли бы попробовать, - это забытый в кэше алгоритм.Для матриц 2k x 2k я получаю 24,7 секунды для варианта с рекурсивным кешем и 50,26 с тривиальным итеративным методом на однопоточном e8400 @ 3 ГГц (и то, и другое можно было бы оптимизировать, очевидно, некоторые лучшие аргументы для компилятора и уверенность в SSE)используется и т. д.).Хотя 500x500 довольно мало, поэтому вам придется попробовать, если это даст вам заметные улучшения.

Рекурсивный обычно проще сделать многопоточным.

О, но самое важное, так как выпишешь в c #: читай this - это для java, но то же самое должно применяться для любого современного JIT ..

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