転置パフォーマンスに対する行列サイズの影響
観察した現象 (513x513 行列と比較して 512x512 行列の転置が遅い) は、次の原因によるものです。キャッシュする
キャッシュの構造とアクセス
キャッシュは、頻繁にアクセスされるデータをプロセッサーの近くに保存することで、メモリを大量に使用するタスクのパフォーマンスの向上に役立つメモリ構造です。データを保持する多数の行を含むセットに編成されます。各キャッシュ ラインのサイズは数バイトで、キャッシュ セットには複数のラインを含めることができます。
メモリ アドレスにアクセスすると、キャッシュはそのアドレスのデータがキャッシュ内のいずれかのラインに存在するかどうかを確認します。対応するセット。一致する場合、キャッシュ ヒットが発生し、データが迅速に取得されます。そうでない場合は、キャッシュ ミスが発生し、メイン メモリからデータをフェッチする必要があり、非常に時間がかかります。
クリティカル ストライドおよびキャッシュ ミス
を使用する場合行列の場合、クリティカル ストライドは、連続パターンでアクセスされる要素間の距離です。あなたの場合、重要なストライドは行列の 1 行の要素間の距離です。ストライドがキャッシュ ライン サイズと一致するか、その倍数である場合、キャッシュ ミスやパフォーマンスの低下につながる可能性があります。
行列転置とクリティカル ストライド
行列転置コードでは、対角に沿って要素を交換します。 512x512 の行列の場合、各行の要素は、キャッシュ ライン サイズと同じ 512 バイトのストライドでアクセスされます。これにより、多数のキャッシュ ミスが発生し、パフォーマンスが低下します。
513x513 が高速である理由
513x513 行列の場合、クリティカル ストライドは次の倍数ではなくなります。キャッシュラインのサイズ。各行の要素は 513 バイトのストライドでアクセスされるため、要素は確実に異なるキャッシュ ラインに分類されます。これにより、キャッシュ ミスの数が減り、パフォーマンスが向上します。
実際的な意味
キャッシュに対するクリティカル ストライドの影響を理解することは、メモリを大量に使用するタスクを最適化するために重要です。あなたの場合、マトリックスのサイズを調整して重要なストライドの倍数を回避すると、移調パフォーマンスが大幅に向上します。
以上が513x513 行列の転置が 512x512 行列よりも速いのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。