高性能计算-探究循环分块优化cache miss(13)(接2-1)

1. 目标:分析循环分块优化技术,并分析cache 命中情况

假设每个cacheline可以存储b个数据元素。

2. 源代码分析

for( int i=0;i<N;i++)
{
	for(int j=0;j<M;j++)
	{
		A[i] += B[j];
	}
}

cache miss分析:

对A总访问次数为 NM,每次访存加载一个cacheline 可以加载b个元素,并且连续访问,该cacheline所有元素在依次被访问前不会被替换掉,共需访存加载cacheline N/b次,每次加载都有一次miss,所以A共有N/b次miss;对B共访问 NM次,当M足够大时,cache无法装载整个数组B,内层一次循环需访存M/b次,N个循环共访存加载cacaheline NM/b次,每加载一次cacheline有一次miss,所以B在全部循环中 miss NM/b。总共 N/b + NM/b次 miss。

3. 循环分块优化

原理:源码中对B的访问miss过高,B cacheline被反复加载,考虑提高B cacheline 加载一次的利用效率,可考虑每加载一次,完成相应所有A元素的访问,假设L1 cache可以满足 A所有元素 cacheline 遍历和 若干组 B cacheline 的计算需求;加载 B cacheline 组的数量不应太大,假设里面包含了 T 个元素应有 T=nb , T,b << M,N。保证访问B[T-1]时,B[0]仍在 cache 中。

代码思路:对高miss 数据的访问索引分块,作为最外层循环控制变量,并在最内层循环控制块内循环。

for(int j=0;j<M;j+=T)
{
	for(int i=0;i<N;i++)
	{
		for(int t=0;t<T;t++)
			A[i] += B[i]; 
	}
}

cache miss分析:

A元素索引i的访问在内2层循环,每次循环共访问N次,每次访问一个cacheline有一个misss,所以每次循环有N/b个不命中,由于j是分块访问,共有 M/b个循环,所以A元素miss为 N/b *(M/T);B元素的访问最内层循环每次循环有 T/b个miss,T的取值为b的倍数并且不能太大,当访问B[T-1]时B[0]仍在cache中,对于第二层i的遍历,此时B[j]元素都在cache中,不影响第三层B元素 miss 数量,共有 M/T 次循环,所有B元素miss为 T/b *(M/T) = M/b。总共 MN/bT + M/b 次 miss。

4. 对比总结

分块前后AB全部miss比为(N/b+MN/b)/ (MN/bT + M/b) ,当MN足够大时,计算极限得 T。

分块后 A的miss增加,B的miss减少,总misss数为原来的 1/T。

相关推荐
高性能服务器11 天前
马斯克万卡集群AI数据中心引发的科技涟漪:智算数据中心挑战与机遇的全景洞察
数据中心·hpc·高性能计算·智算中心·马斯克ai数据中心·colossus·xai
orlion1 个月前
使用AVX2指令集加速推荐系统MMR层余弦相似度计算
go·高性能计算
高性能服务器2 个月前
探索GPU算力在大模型和高性能计算中的无限潜能
算法·语言模型·gpu算力·hpc·高性能计算
迪普微社区4 个月前
解锁算力新极限,Xilinx UltraScale+赋能的高性能低延时FPGA加速卡
网络·fpga开发·fpga·芯片·xilinx·高性能计算·加速卡
小信瑞5 个月前
IBM Spectrum LSF Data Manager,独立于群集工作负载进行数据传输管理,以提高吞吐量并优化计算资源的使用
集群管理·计算资源管理·hpc·高性能计算·工作负载管理·作业调度系统·工作负载迁移
小信瑞7 个月前
Altair® (澳汰尔)Grid Engine® 分布式资源管理系统
分布式·自动化·资源管理·高性能计算·澳汰尔·altair·资源管理系统
whyte王7 个月前
CUDA 12.4文档5 编程接口-使用CUDA运行时-初始化&设备内存
gpu·cuda·hpc·高性能计算
小信瑞8 个月前
Altair® RapidMiner®数据分析与人工智能平台
人工智能·ai·数据挖掘·数据分析·仿真·高性能计算
Eloudy9 个月前
从源代码安装 rocSOLVER 并 调试 rocSOLVER 在 Ubuntu 22.04 平台
linux·pytorch·高性能计算