除了对缓存中保存的数据执行大量浮点运算的代码外,大多数浮点密集型代码的性能受限于内存带宽和缓存容量,而不是触发器。
v和乘积和都是长度为 2000(双精度为 16K 字节)的向量,很容易放入 1 级缓存。矩阵和的大小为 2000 x 2000 或大约 32 兆字节。如果你有一个非常好的处理器,你的 3 级缓存可能足够大来存储这些矩阵之一。AvBvAB
计算需要从内存中读取 32 兆字节(对于),读取 16K 字节(对于AvAv) 将中间结果存储在 L1 缓存中,并最终将 16K 字节写入内存。乘法Bv需要相同的工作量。添加两个中间结果以获得最终结果需要少量的工作。总共大约 64 兆字节的读取和少量的写入。
计算(A+B)需要从内存中读取 32 兆字节(用于 A)加上 32 兆字节(用于 B)并写出 32 兆字节(用于 A+B)。然后你必须像上面那样做一个矩阵向量乘法,它涉及从内存中读取 32 兆字节(如果你有一个大的 L3 缓存,那么这 32 兆字节可能在那个 L3 缓存中。)总共有 96 兆字节读取和 32 兆字节的写入。
因此,计算它所涉及的内存流量是其两倍(A+B)v代替Av+Bv.
请注意,如果您必须使用不同的向量进行许多乘法运算v但同样A和B,那么计算效率会更高A+B一次并将该矩阵重用于矩阵向量乘法。