循环优化对能耗及Java性能的影响
循环优化与能耗
在多存储体内存架构中,线性循环变换即使在没有缓存的系统中也可能有益。以下是具体的操作策略:
- 无缓存系统 :编译器会积极优化空间和时间局部性,使用特定的循环变换框架。但如果变换不能减少同时激活的存储体数量或聚集数组访问(如数组能放入单个存储体),则不进行变换。
- 有缓存系统 :考虑缓存特性来优化局部性,仅在需要区分无缓存局部性的引用时,才利用存储体特性。例如,对于操作三个数组的嵌套循环,有两种优化方式,策略会计算每种方式下访问的不同存储体数量,选择访问存储体最少的方式。
当考虑不同优化之间的相互作用时,问题变得更复杂。提高数据局部性和降低片外内存能耗这两个目标函数可能需要不同的变换组合。以下是一个嵌套循环示例:
for(i=1;i<L;i++)
for(j=1;j<L;j++)
{
a[i][j] = b[i][j] + 1;
c[i][j] = d[i][j] - 1;
}
假设数组a和b存储在一个存储体,c和d存储在另一个存储体。数据局部性优化方案通常不对此循环进行变换,而内存能耗优化策略会应用循环分布来隔离对各个存储体的访问,以最大化每个存储体的空闲时间。
为了同时优化片外能耗和缓存局部性,提出了一种启发式策略:
1. 应用循环分裂,尽可能隔离嵌套循环,使编译器能关闭更多内存存储体。
2. 应用考虑存储体的循环融合,利用缓存