私は、キャッシュの局所性をよりよく認識できるように努めてきました。両方のキャッシュの局所性の特徴をよりよく理解するために、2 つのコード スニペットを作成しました。
vector<int> v1(1000, some random numbers);
vector<int> v2(1000, some random numbers);
for(int i = 0; i < v1.size(); ++i)
{
auto min = INT_MAX;
for(int j = 0; j < v2.size(); ++j)
{
if(v2[j] < min)
{
v1[i] = j;
}
}
}
対
vector<int> v1(1000, some random numbers);
vector<int> v2(1000, some random numbers);
for(int i = 0; i < v1.size(); ++i)
{
auto min = INT_MAX;
auto loc = -1;
for(int j = 0; j < v2.size(); ++j)
{
if(v2[j] < min)
{
loc = j;
}
}
v1[i] = loc;
}
最初のコードv1
では、if ステートメント内で直接更新されています。これにより、更新中に現在のキャッシュ ラインが からのデータの連続したセグメントに置き換えられるため、キャッシュの局所性の問題が発生しますv1[i] to v1[cache_line_size/double_size]
か? この分析が正しければ、ループj
の反復ごとにj
キャッシュ ミスが発生する可能性が高いため、ループの速度が低下しているように見えます。2 番目の実装では、ローカル変数を使用し、ループが完了するv1[i]
まで更新しないことで、この問題を軽減しているようです。j
実際には、コンパイラがキャッシュの局所性の問題を最適化する可能性があると思いますか? 議論のために、コンパイラーの最適化がないと仮定してはどうですか。