Более быстрое умножение матриц в C #

У меня есть небольшой проект C #, который включает матрицы. Я обрабатываю большие объемы данных, разделяя их на блоки длиной n, обрабатывая блоки как векторы и умножая на матрицу Вандермонда **. Проблема в том, что в зависимости от условий размер патронов и соответствующей матрицы Вандермонда ** может варьироваться. У меня есть общее решение, которое легко читать, но слишком медленно:

    public byte[] addBlockRedundancy(byte[] data) {
        if (data.Length!=numGood) D.error("Expecting data to be just "+numGood+" bytes long");

        aMatrix d=aMatrix.newColumnMatrix(this.mod, data);
        var r=vandermonde.multiplyBy(d);
        return r.ToByteArray();
    }//method

Это может обрабатывать около 1/4 мегабайта в секунду на моем i5 U470 @ 1,33 ГГц. Я могу сделать это быстрее, вручную вставив матричное умножение:

        int o=0;
        int d=0;
        for (d=0; d<data.Length-numGood; d+=numGood) {
            for (int r=0; r<numGood+numRedundant; r++) {
                Byte value=0;
                for (int c=0; c<numGood; c++) {
                    value=mod.Add(value, mod.Multiply(vandermonde.get(r, c), data[d+c]));
                }//for
                output[r][o]=value;
            }//for
            o++;
        }//for

Это может обрабатывать около 1 мегабайта в секунду.

(Обратите внимание, что «мод» выполняет операции над GF (2 ^ 8) по модулю моего любимого неприводимого полинома.)

Я знаю, что это может быть намного быстрее: в конце концов, матрица Вандермонда ** в основном состоит из нулей . Я должен быть в состоянии создать процедуру или найти процедуру, которая может взять мою матрицу и вернуть оптимизированный метод, который будет эффективно умножать векторы на данную матрицу, но быстрее. Затем, когда я даю этой программе матрицу Вандермонда 5x5 (единичную матрицу), здесь просто нет арифметических действий, и исходные данные просто копируются.

** Обратите внимание: то, что я использую термин «Вандермонд», я на самом деле имею в виду матрицу идентичности с некоторым количеством строк из добавленной матрицы Вандермонда ( см. комментарии). Эта матрица прекрасна тем, что в ней все нули, и потому, что если вы удалите достаточно строк (по вашему выбору), чтобы сделать ее квадратной, это будет обратимая матрица. И, конечно же, я хотел бы использовать ту же процедуру для преобразования любой из этих инвертированных матриц в оптимизированную серию инструкций.

Как я могу ускорить умножение матриц?

Спасибо!

(отредактировано, чтобы исправить мою ошибку с матрицей Вандермонда)

9
задан Kyle Lahnakoski 29 December 2010 в 16:28
поделиться