Матрица-вектор, кратная ДГЭМ - PullRequest
0 голосов
/ 09 апреля 2011

Я делаю большое количество матрично-векторных умножений в моем коде.Я обнаружил, что моя наивная реализация превосходит cblas_dgemm в MKL10.Мое собственное предположение, почему это может иметь место, dgemm делает альфа * A * B + бета * C, тогда как я делаю только A * B.Но наивная реализация значительно лучше (~ 3-кратное ускорение).Любые мысли, почему это может иметь место?

Вот реализация матрицы-вектора-мульт:

void mat_vec_mul(double *a, double *b, double *c, int m, int k)
{

    for (int ii = 0; ii < m; ii++){
        for (int kk = 0; kk < k; kk++){
            *c += *(a+ii*k+kk) * *(b+ii);       

        }
        c++;
    }
}   

Ответы [ 2 ]

0 голосов
/ 31 августа 2011

Исходная подпрограмма blas http://www.netlib.org/blas/dgemm.f содержит ряд операторов if, которые проверяют значение беты. Я предполагаю, что это уже порождает некоторые издержки в исполнении. Интересно, что произойдет, если вы возьмете оригинальную процедуру dgemm и специализируете ее на рассматриваемом вами деле. Кроме того, было бы неплохо увидеть сравнение в зависимости от размера матрицы.

0 голосов
/ 09 апреля 2011

Ну, вы тестировали код.Но почему бы не попробовать выполнить умножение так же, как DGEMM?

Вы уже заявили, что DGEMM выполняет альфа * A * B + бета * C, так почему бы не попробовать написать это тоже и посмотреть, как оно сравниваетсяс DGEMM.

Вы, вероятно, обнаружите, что это так же быстро (или медленнее), чем DGEMM.Вы делаете намного меньше операций, что, скорее всего, является причиной того, что это быстрее.

...