0

C を値 C*B で更新したいと思います。また、値 C*C で C を更新したいと思います。

これを行うのは安全ですか?生徒に悪いコードを教えたくありません。現在、一時的な結果を cblas_gemm(...) から C マトリックスにコピーしています...これは遅いです。

4

2 に答える 2

1

入力と出力の両方に同じ行列を安全に使用できる場合は、BLAS 実装で一時的なワークスペースを使用する必要があります。関数がワークスペースを要求しなかったためにそのようなワークスペースを提供しなかったため、同じ行列を入力と出力として使用することはできないと結論付けることができます。

実際、BLAS ルーチンがパラメーターを入力と出力の両方として受け入れる場合は、2 つではなく 1 つのパラメーターを使用し、そのパラメーターが入力と出力の両方に使用されることを文書化することで、これを行います。

一時的な出力変数を使用し、BLAS 呼び出しの後にコピーするのは遅いと言っています。しかし、そのコピー操作は、行列の乗算と比較して重要ではありません。コピーがボトルネックであると確信していますか? 間に合いましたか?

于 2012-04-24T05:42:14.583 に答える
0

BLAS 規格 (ここから入手可能) には次のように書かれています。

このルーチンは、一般行列の行列乗算を実行します。ここで .... A、B、および C は一般行列です。

したがって、それは実装で定義されていると言えます。そうするのは安全ではない可能性があると想定できます。ただし、特定の実装を使用している場合は、その実装のソースをいつでも確認できます。

あるいは、コメンターが示唆しているように、SYRK はあなたが望むことを行うかもしれません。

于 2012-04-24T05:16:19.747 に答える