費用について教えてくるL1キャッシュは見逃せないぞ!
-
13-09-2019 - |
質問
編集:参照目的の場合は誰にも理解がここにいIgor Ostrovsky書 ソレックス 約キャッシュのヒント.かつ複数の課題を示す例。 終編集
った試験 <long story goes here>
やべた場合の性能差によるキャッシュメモリかヒント.次のコードの問題沸かの重要なタイミングです。次のコードは、カップルのループを訪れるというメモリランダムな順序で、その後上昇住所ます。
を行ったので、XPマシン(コンパイルされてVS2005:cl/O2およびLinuxボックス(gcc–プしていきます。両生類。これらの時間(ミリ秒単位.いすべてのループを走っていませんの最適化(その他で行う"瞬間").
*** Testing 20000 nodes Total Ordered Time: 888.822899 Total Random Time: 2155.846268
これらの数字しょう?の差の主な原因L1キャッシュのヒントはなんでも見ることができますか?あ20,000^2のメモリアクセスを入れたキャッシュミスは、約32ナノ秒単位当たります。のXP(P4)機械では3.2GHzの疑いがん)は32KB L1キャッシュ512KB L2.20,000件(80KB),ものがあるのだろうと思っていない変数にはL2かヒント.このう (3.2*10^9 cycles/second) * 3.2*10^-9 seconds/miss) = 10.1 cycles/miss
.そう高めました。おかないというか私の数学が悪かったりします。また測定キャッシュのヒントとのコマでまた安心して任せ.やってきて、自分のやりたいなので接続するライセンスサーバ(ぷら).
typedef struct stItem
{
long lData;
//char acPad[20];
} LIST_NODE;
#if defined( WIN32 )
void StartTimer( LONGLONG *pt1 )
{
QueryPerformanceCounter( (LARGE_INTEGER*)pt1 );
}
void StopTimer( LONGLONG t1, double *pdMS )
{
LONGLONG t2, llFreq;
QueryPerformanceCounter( (LARGE_INTEGER*)&t2 );
QueryPerformanceFrequency( (LARGE_INTEGER*)&llFreq );
*pdMS = ((double)( t2 - t1 ) / (double)llFreq) * 1000.0;
}
#else
// doesn't need 64-bit integer in this case
void StartTimer( LONGLONG *pt1 )
{
// Just use clock(), this test doesn't need higher resolution
*pt1 = clock();
}
void StopTimer( LONGLONG t1, double *pdMS )
{
LONGLONG t2 = clock();
*pdMS = (double)( t2 - t1 ) / ( CLOCKS_PER_SEC / 1000 );
}
#endif
long longrand()
{
#if defined( WIN32 )
// Stupid cheesy way to make sure it is not just a 16-bit rand value
return ( rand() << 16 ) | rand();
#else
return rand();
#endif
}
// get random value in the given range
int randint( int m, int n )
{
int ret = longrand() % ( n - m + 1 );
return ret + m;
}
// I think I got this out of Programming Pearls (Bentley).
void ShuffleArray
(
long *plShuffle, // (O) return array of "randomly" ordered integers
long lNumItems // (I) length of array
)
{
long i;
long j;
long t;
for ( i = 0; i < lNumItems; i++ )
plShuffle[i] = i;
for ( i = 0; i < lNumItems; i++ )
{
j = randint( i, lNumItems - 1 );
t = plShuffle[i];
plShuffle[i] = plShuffle[j];
plShuffle[j] = t;
}
}
int main( int argc, char* argv[] )
{
long *plDataValues;
LIST_NODE *pstNodes;
long lNumItems = 20000;
long i, j;
LONGLONG t1; // for timing
double dms;
if ( argc > 1 && atoi(argv[1]) > 0 )
lNumItems = atoi( argv[1] );
printf( "\n\n*** Testing %u nodes\n", lNumItems );
srand( (unsigned int)time( 0 ));
// allocate the nodes as one single chunk of memory
pstNodes = (LIST_NODE*)malloc( lNumItems * sizeof( LIST_NODE ));
assert( pstNodes != NULL );
// Create an array that gives the access order for the nodes
plDataValues = (long*)malloc( lNumItems * sizeof( long ));
assert( plDataValues != NULL );
// Access the data in order
for ( i = 0; i < lNumItems; i++ )
plDataValues[i] = i;
StartTimer( &t1 );
// Loop through and access the memory a bunch of times
for ( j = 0; j < lNumItems; j++ )
{
for ( i = 0; i < lNumItems; i++ )
{
pstNodes[plDataValues[i]].lData = i * j;
}
}
StopTimer( t1, &dms );
printf( "Total Ordered Time: %f\n", dms );
// now access the array positions in a "random" order
ShuffleArray( plDataValues, lNumItems );
StartTimer( &t1 );
for ( j = 0; j < lNumItems; j++ )
{
for ( i = 0; i < lNumItems; i++ )
{
pstNodes[plDataValues[i]].lData = i * j;
}
}
StopTimer( t1, &dms );
printf( "Total Random Time: %f\n", dms );
}
解決
ができないお答えするか否かの意味になるだけでなく、キャッシュ遅延が記録~10サイクルL1キャッシュのヒント音約権をご用意できます Cachegrind ツールとしてのお見の違いをキャッシュの性能と2試験までを実施。
CachegrindはValgrindツールの枠組みとして、常に可愛らしいmemcheck)のプロファイルのキャッシュおよび支店曲/ヒント.でありますので、参考にして下さいどのように多くのキャッシュヒット/逃して実際に得ます。
他のヒント
こちらではの試みに関する理解を深めるうえで、相対コストのキャッシュミスによる類推焼きチョコチップクッキー...
お手ご登録する す1秒ドチョコレートチップ込めるための術を教えます。
キッチンのカウンターがL1キャッシュ、十二倍遅登録する で12x1=12秒に一歩足を踏み入れるカウンターのバッグのくるみ、空の一部を入できます。
冷蔵庫のごL2キャッシュ度より遅くなL1. で4×12=48秒まで徒歩冷蔵庫完備されている内容が消えてしまう、昨夜の残り物にして繰り返し使用しているカートンの卵のカートン、3卵のカウンター、スカートン、冷蔵庫付き。
棚のごL3キャッシュ、三倍遅L2. か3×48=2分24秒ルを組み合わせることによりお子様の年齢を入力してくださ戸棚、曲げ、扉を開ければ、根の周りにベーク供給錫、抽出物から食器棚開こうとすると、掘りの焼成粉末のカウンター、掃引までにゃんこぼれます。
主メモリ?このコーナー店、5倍遅L3. で5x2:24=12分お財布、靴、ジャケット、ダッシュ、トラリットルの牛乳、ダッシュの家、靴を脱いで、ジャケットや、キッチン。
ご注意 すべての これらのアクセスを常に複雑--O(1)ですが、その違いはないで 巨大 セレクトショップ。最適化のために純粋にbig-O複雑さがうかどうかを決定する追加チョコレートチップの番1時間10時も忘れることについてのお食料品一覧です。
モラルのストーリー: 整理メモリにアクセスなので、CPUへの食となどが可能です。
番号からの CPUキャッシュフラッシング誤 ブログが、それは特定の2012年時代のIntelプロセッサにはtrue:
- 登録アクセス=4の指示を当サイクル
- L1遅延=3サイクル(12x登録)
- L2遅延=12サイクル(4×L1,48x登録)
- L3遅延=38サイクル(3×L2,12×L1,144x登録)
- DRAM遅延=65ns=195サイクルの3GHz CPU(5x L3,15×L2,60×L1,720x登録)
の ギャラリーのプロセッサーのキャッシュ効果 も読み込んでいます。
3.2ns、L1キャッシュミスは完全に見える。比較のため、特に現代のマルチコアPowerPC CPU、L1は見逃約 40 サイクル--少しでも長く一部のコア、これからL2キャッシュ(有んは、L2逃が 少なくとも 600 サイクルです。
キャッシュは全性能Cpuはるかに上記憶を今にいることもほとんどの最適化のためのメモリバスの代わります。
もあるように主にL1キャッシュのヒント.
10サイクルのためL1キャッシュを見逃さな音程の合理的な、ほんの少しは低めに設定されている。
読み込みからRAMには、100番手双糸合でも1000番台(Amすぎて疲れを行おうとすることの例を紹介し、今;))のサイクルそのも大きな勝ち取れます。
する予定がある場合をcachegrind,がありますのでご注意くださいキャッシュヒット/missシミュレータです。んので、常に正確なものでなければならない。例えば:まアクセスメモリの場所か0x1234ループで1000倍cachegrindますメインメニューからツールすることの一つが達成されたキャッシュミス(最初のアクセス)などのようなもの:
clflush0x1234ごループを実行します。
X86、すべての原因1000キャッシュのヒント.
一部の数字3.4GHz P4からLavalysのエベレスト実行します:
- L1dcacheは8K(cacheline64バイト)
- L2は512K
- L1のフェッチ時間を2サイクル
- L2取得の遅延があるのでん:20サイクル
ます。http://www.freeweb.hu/instlatx64/GenuineIntel0000F25_P4_Gallatin_MemLatX86.txt
(遅延を見下のページ)
この何とも言い難いだせずに多くの試験が、私の経験がこの規模の差があるのCPU L1/L2またはキャッシュ、特にシナリオランダム化。ではありませんので悪くても確保によりそれぞれのアクセスは少なくとも最低限の距離です。
最も簡単なものなのかをスケール写真の対象cpuおよび身体測定の距離をコアにレベル1のとします。掛けるようになりの距離電子が走行できることを目銅。その姿をどのように多くの時計サイクルできています。ことになる最小限のcpuサイクルだ廃棄物は、L1キャッシュ。
こともでき、最小のコストの取得データからRAMに数CPUサイクルの無駄を実装する予定です。がきっと驚かれる.
通知のうまみがここにあなたのキャッシュ-リスクアセスメントの題材でL1はL1、L2)が正常にキャッシュを引き出データを同一のキャッシュ行きのアクセスなど身近なものを用いてそのキャッシュ-ラインを必要以つアプリです。
しかし、何だろうと思った方も多いのは、このRAM(とっても電話のランダムアクセスメモリ)がpreferresリニアメモリアクセス。