0

コードで多数の行列とベクトルの乗算を行っています。私の単純な実装は、MKL10 の cblas_dgemm より優れていることがわかりました。これが当てはまる理由は、dgemmが alpha*A *B + beta *C を実行するのに対し、私は A*B しか実行していないためだと思います。しかし、単純な実装は大幅に優れています (〜 3 倍のスピードアップ)。なぜこれが当てはまるのでしょうか?

以下は、matrix-vector-mult の実装です。

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++;
    }
}   
4

2 に答える 2

0

さて、あなたはコードをベンチマークしました。しかし、DGEMM と同じ方法で乗算を実行してみませんか?

DGEMM が alpha * A * B + beta * C を行うと既に述べたので、それも書いてみて、DGEMM と比較してみてください。

おそらく、DGEMM よりも高速 (または低速) であることがわかります。実行する操作が大幅に減っています。これが、より高速な理由である可能性が最も高いです。

于 2011-04-09T02:06:41.053 に答える
0

元の blas ルーチンhttp://www.netlib.org/blas/dgemm.fには、beta の値をテストする多数の if ステートメントが含まれています。私はそれがすでにパフォーマンスにいくらかのオーバーヘッドを生成していると思います。元の dgemm ルーチンを使用して、検討しているケースに特化するとどうなるのだろうか。さらに、マトリックスサイズによる比較も見られるとよいでしょう。

于 2011-08-31T14:25:58.063 に答える