最近接ペアアルゴリズムを使用するアプリケーション用に要素の配列をキャッシュする方法を見つけようとしています(当面は総当たり攻撃)。The Cache Performance and Optimization of Blocked Algorithm の論文によると、次のように書かれています。
ブロッキングは、メモリ階層の有効性を高めるための一般的な最適化手法です。階層のより高速なレベルでデータを再利用することにより、平均アクセス遅延を削減します。また、階層のより遅いレベルへの参照の数を減らします。したがって、ブロッキングは、プリフェッチなどの最適化よりも優れています。プリフェッチは、レイテンシを隠しますが、メモリ帯域幅要件を削減しません。メモリ帯域幅がシステムのボトルネックになることが多いため、この削減はマルチプロセッサにとって特に重要です。ブロッキングは、線形代数の多くのアルゴリズムで役立つことが示されています。
この論文は行列乗算コードを提供し、キャッシュミスを減らしてブロッキングに変更されています。
for kk = 1 to N by B
for j = 1 to N by B
for i = 1 to N
for k = kk to min(kk + B-1, N)
r = X[i,k]; // register allocated
for j = jj to min(jj + B-1, N)
Z[i,j] += r * Y[k,j];
ここで、Bがブロッキング ファクターですが、これをどのように判断できますか? CPUキャッシュが処理できる特定の制限を見つける一般的な方法はありますか? おそらく、すべての CPU が同じキャッシュを持っているわけではありません。一般的な手順は次のように述べています。
- 1 つ目は、コードを再構築して、再利用を伴うループをブロックできるようにすることです。
- 2 つ目は、局所性を最大化するブロッキング ファクターを選択することです。
最近接ペア アルゴリズム (ブルート フォース) は次のとおりです。
minDist = infinity
for i = 1 to length(P) - 1
for j = i + 1 to length(P)
let p = P[i], q = P[j]
if dist(p, q) < minDist:
minDist = dist(p, q)
closestPair = (p, q)
return closestPair
総括する:
- 特定の CPU キャッシュ サイズの制限を手動でテストすることなく、B ファクターを最適化するにはどうすればよいですか。C言語を使用して現在利用可能なキャッシュを返す方法はありますか?
- 1D 配列を使用する最も近いペア アルゴリズムを最適化するにはどうすればよいですか? つまり、x、y 座標を含む struct 要素の 1D 配列であり、すべてのポイントを他のすべてのポイントと比較する必要があるため、どの要素を保存して再利用する必要があるかということです (ブルート フォース アルゴリズムに固執しましょう)。
前もって感謝します!