loop transformation:模型的并行和局部性(时间和空间)
loop fusion
循环融合,就是将多个循环融合在一起。融合在一起的好处包括充分利用数据的局部性,同时利用一些pipeline/multithread的技术可以减少计算时间。
例如对于下面的循环:
在没有融合之前,我们得先访问A[i],然后串行访问B[i]。我们得launch两个kernel,也就是每个kernel都得处理一个for循环,这种增加了局部性。将一个整体的for循环拆成多个for循环称为loop fission.
我们将两个循环融合在一起,虽然也是串行访问,但是访问的顺序变化了,因此我们利用这种数据的时间的局部性,利用多线程进行处理,我们就可以使用pipeline将计算的时间减少。
尽可能将多个for循环的计算融合在一起,这样好处:
可以减少on-chip和off-chip数据的访存和搬运,节省硬件的能耗
减少kernel的launch.
loop skew
loop仿射变换(平移,放缩数轴…),然后使得不同块之间的访问的数据依赖性降到最低。
例如下面的循环: