memset を使用すると、大量のメモリがキャッシュされますか?

Arm アーキテクチャでは、ほとんどの通常のメモリ構成は書き込み割り当てと読み取り割り当てであることがわかっています。つまり、メモリの書き込みまたは読み取りの際にミスが発生すると、物理メモリがキャッシュにキャッシュされます。 。そこで思いついたのですが、len が大きいときに memset(a, b, len) を実行すると、つまり大きなメモリの 0 をクリアすると、この大きなメモリのデータ (この時点ではすべて 0 データ) をキャッシュにキャッシュする必要がありますか? これはキャッシュの無駄遣いにならないでしょうか? キャッシュはすぐにいっぱいになりますか?

以前のマイクロアーキテクチャでは、この問題は実際に存在していた可能性があります。それが近年のマイクロアーキテクチャでは「書き込みストリーミングモード」で解決できるようになりました。具体的には以下のとおりですが、Cortex-A720を例に説明していきます。

Cortex-A720 コアは、L1 キャッシュと L2 キャッシュの両方で、読み取り割り当てモードとも呼ばれる書き込みストリーミング モードをサポートします。
読み取りミスまたは書き込みミスの場合、キャッシュ ラインは L1 キャッシュまたは L2 キャッシュに割り当てられます。ただし、大きなデータの塊を書き込むと、キャッシュが不要なデータでいっぱいになる可能性があります。これは電力を浪費するだけでなく、後続の書き込み (memset() や memcpy() の使用など) によって行全体が上書きされるため、パフォーマンスも低下します。場合によっては、書き込み時にキャッシュ ラインを割り当てる必要がありません。たとえば、C 標準ライブラリの memset() 関数を実行して、メモリの大部分を既知の値にゼロ設定する場合です。
不必要なキャッシュ ラインの割り当てを防ぐために、メモリ システムはコアが一連の完全なキャッシュ ラインを書き込んだことを検出します。設定可能な数の連続したラインフィルでこれが検出されると、書き込みストリーミングモードに切り替わります。

書き込みストリーミング モードでは、ロード操作は通常どおり動作しますが、依然としてライン フィルが発生する可能性があります。
書き込みは引き続きキャッシュ内で行われますが、失敗した場合は、L1 のライン充填を開始せずに L2 または L3 キャッシュに書き込まれます。

CHI マスターまたは AXI マスター インターフェイスは、メモリ システムが書き込みストリーミング モードに切り替わる前に、指定された数を超えるライン フィルを監視する場合があります。

書き込みストリーミング モードは、次のいずれかの条件が発生するまで有効のままです。
• 完全なキャッシュ ラインではないキャッシュ可能な書き込みバーストが検出された。
• ターゲットが未処理の書き込みストリームと同じである後続のロード操作があります。

Cortex-A720 コアが書き込みストリーミング モードに切り替わると、メモリ システムはバス トラフィックを監視し続けます。キャッシュ ライン書き込みの完全なシーケンスを監視すると、L2 または L3 キャッシュに書き込みストリーミング モードに入るように信号を送ります。
書き込みストリームしきい値は、ストレージ操作によるキャッシュ割り当てが停止されるまでに書き込むことができる連続キャッシュ ラインの数を定義します。レジスタ IMP_CPUECTLR_EL1 に書き込むことで、各キャッシュ (L1、L2、および L3) の書き込みストリームしきい値を構成できます。

おすすめ

転載: blog.csdn.net/weixin_42135087/article/details/133560137