2

sbrk(プログラムは、 ) 関数を使用して大きな配列を宣言します。Sbrk は、指定された増分でデータ セグメント サイズを変更します。私が使用している標準ライブラリ関数、例えば:

#include  <stdio.h>  
#include <sys/time.h>  
#include <unistd.h> 

私の main() 関数は、変数を宣言することから始めます。 register *a; 私の目標は、メモリアクセス中に使用するすべての変数をレジスタに入れようとすることです。なぜなら、必要なメモリアクセスは配列に対するものだけだからです。ローカル変数がメモリに存在する場合、それらにアクセスすると測定に影響を与える可能性があります。次に、約 400 万個の整数からなる配列 (32 ビット マシンでは 16 MB) を割り当てます。

a=sbrk(4*1024*4096+8192);
a=(int  *)((((int)a>>13)<<13)+8192);

プログラムが開始されると、一部のメモリが割り当てられます。この関数sbrk()は、このメモリを指定された量だけ増やします。関数呼び出しの後、「a」はこの巨大な配列の先頭を指します。

今、キャッシュブロックのサイズを取得するために何をすべきかわかりませんが、何か提案はありますか?

4

1 に答える 1

2

私が知っているストレート C では、キャッシュ ライン サイズを取得する方法はありません。x86 プロセッサを使用している場合は、cpuid を使用して CPU にキャッシュ ライン サイズを問い合わせることができます。

このページには、その方法の説明が含まれています。まで下にスクロールしCPUID — Detecting Cache Line Sizesます。

プリフェッチや clflush などの命令を使用して積極的にキャッシュにデータをフラッシュしてプリフェッチする場合は、プロセッサのキャッシュ ライン サイズを見つけることが役立ちます。これを検出する方法は、CPU のメーカーによって異なります。

Intel マイクロプロセッサの場合、キャッシュ ライン サイズは、cpuid 関数 0x1 を呼び出した後に bh に 8 を掛けることで計算できます。

AMD マイクロプロセッサの場合、cpuid 関数 0x80000005 を呼び出した後のデータ キャッシュ ライン サイズは cl であり、命令キャッシュ ライン サイズは dl です。

キャッシュ ライン サイズを把握することで、効果的なプリフェッチとフラッシュをディスパッチできます。また、データをキャッシュ ラインの境界に合わせて、パフォーマンスに影響を与える分割されたキャッシュ ラインからのロードを回避するのにも役立ちます。

于 2012-11-27T19:09:08.437 に答える