2012-04-24 11 views
0

Cを値C * Bで更新したいと思います。また、Cを値C * Cで更新したいと思います。cblas_gemm(...)の "C"と "A"マトリックスの両方と同じマトリックスポインタを渡すことはできますか?

これは安全ですか?私は学生に悪いコードを与えたくありません。私は現在、一時的な結果をcblas_gemm(...)からCの行列にコピーしています...遅いです。

+0

これをコードで簡単にテストする方法はありますか?おそらくそれはおそらく最も真っ直ぐ前向きな方法だと思う。しかし、私はblasに慣れていません... – Michael

+0

動作は実装固有のものですが、blasの1つの風味に作用するものは別のものでは失敗するかもしれませんが、そうするのは安全だとは思いません。しかし、GEMMはあなたが必要としているものですか? SYRKはどうですか? – talonmies

+0

いいえ、そうするのは安全ではありません。 – Anycorn

答えて

0

BLAS標準(available here)がちょうど言う:

をルーチンは.... A、B及びCは、一般的な行列である一般的な行列の行列乗算を行います。

だから、私は実装が定義されていると言いたいのですが、そのようにするのは危険かもしれないと思います。ただし、特定の実装を使用している場合は、その実装のソースをいつでも確認できます。

コメント者からもわかるように、SYRKはあなたが望むことをするかもしれません。

+1

syrkは対称行列です –

1

BLAS実装では、入力と出力の両方に同じマトリックスを使用することが安全だった場合、一時的な作業領域を使用する必要があります。関数が要求しなかったためにこのようなワークスペースを提供しなかったので、入力と出力と同じ行列を使用することはできません。

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

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

関連する問題