我正在尝试找到一种方法来为使用最近对算法(暂时是蛮力)的应用程序缓存我的元素数组。根据阻塞算法的缓存性能和优化论文,它说:
阻塞是一种提高内存层次结构有效性的通用优化技术。通过在更快的层次结构中重用数据,它减少了平均访问延迟。它还减少了对层次结构较慢级别的引用数量。因此,阻塞优于诸如预取之类的优化,它隐藏了延迟但不会降低内存带宽需求。这种减少对于多处理器来说尤其重要,因为内存带宽通常是系统的瓶颈。分块已被证明对线性代数中的许多算法很有用。
该论文给出了一个矩阵乘法代码,并将其修改为减少缓存未命中的阻塞:
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 都具有相同的缓存。通用程序说:
- 首先是重构代码以阻止那些携带重用的循环。
- 其次是选择最大化局部性的阻塞因子。
最接近的配对算法(蛮力)是:
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
总结一下:
- 如何优化 B 因子而无需手动测试特定 cpu 缓存大小的限制。有没有办法使用 C 语言返回当前可用的缓存?
- 如何优化使用一维数组的最近对算法?我的意思是,哪些元素应该被存储和重用,因为它是一个包含 x、y 坐标的结构元素的一维数组,并且每个点都必须与所有其他点进行比较(让我们坚持使用蛮力算法)。
提前致谢!