2017-10-01 7 views
-1

私はすべての行主要な列の主要な背後にあるロジックを見つけるためにGoogleの上に行ってきたが、私の質問の答えを見つけるように見えなかった。
私の質問は次のとおりです:
私は行列の次元の3つのタイプがあります。 5x50000,500x500,50000x5。 3つすべてが250000の同じ倍数を持つことになります。しかし、これらの乗算が行メジャーで行われると、なぜ5x50000行列が実行に最も時間がかかりますか?私はこれがキャッシュと関係していることを知っています。私のマシンはL1 32K、L2 256K、L3 8192kを持っています。Cで行優先の乗算マルチスレッディング

私はCプログラムの配列が連続した行を最速にすることを理解していましたが、私の質問はこれと何が関係しているのですか?5x50000マトリックスが最悪になりますか?それは大きな柱を持っているからでしょうか?と500x500が最適ですか?

説明は非常に役に立ちます。おかげさまで

+0

私が覚えている限り、2つの行列M1とM2を乗算するには、M1の列の数をM1の行の数と等しくする必要があります。 – babon

+0

はい、もちろん!私は問題の行列の次元(rowxcol)を指定しました。私のコードでは、ロジックはA [i] [j] = A [i * n + j]です。ここで、iとjは行列Aの行インデックスとcolインデックス、そしてnは列の数です。これは行優先の乗算です。 – Dee

+0

どのような順序で3つの行列を掛けていますか? – babon

答えて

0

私が知る限り、配列はメモリ上のブロックに格納されています。大きな配列をリクエストすると、PCはそのスペースをすべて一度に探します。そして、同時に配列をメモリ内で連続させようとします。

メモリ割り当てによる超過時間の5倍の50000スロットのアレイを要求します。コンピュータの場合、メモリ内に連続して500個の連続スロットを500回見つけるのが簡単です。

+0

さて、その場合、私は50000x5でも最悪のケースを生成するはずだと思いますが、そうではありませんでした。どうしてこんなことに? – Dee

+0

いいえ! PCが50000スロットの5つのスペースを見つけようとするため、最悪の場合は5x50000です。 50000x5でコンピュータは5スロットの50000スペースを探しています。それは他のもののたくさんのメモリに小さなスペースの多くを見つけるのは簡単です... –