这是英特尔优化的 Linpack 基准测试的设置。您似乎感到困惑的参数都与矩阵的表示和访问方式有关。
输入参数
Linpack 基准解决了N
联立线性方程组。
a11 * x1 + a12 * x2 + .. + a1N * xN = b1
a21 * x1 + a22 * x2 + .. + a2N * xN = b2
...
aN1 * x1 + aN2 * x2 + .. + aNN * xN = bN
这相当于求解一个向量方程Ax=b
,其中x
和b
是 N 维向量,并且A
是N*N
矩阵。
一个N*N
矩阵在内存中表示为一个N*N
数组,其中各个列存储在偏移量0
等处。请注意n
,2*n
我们使用不同的符号n
而不是N
。原因是当n=N
算法在多个并行线程中运行时可能会遇到一种称为缓存抖动的现象。请避免这种情况,建议设置n>N
在列数据之间插入一些填充。通常n
被选为可被 8 整除且大于 的最小整数N
。所以我们完成了第 2 行和第 3 行。第 2N
行是,第 3 行是n
。
Linpack 基准测试使用多个数组。再次为了有效地使用缓存,建议让所有数组都从内存页面的边界开始。因此它们与 4k 边界对齐。对于较大的页面,将此值设置为较大的数字可能有意义,例如 16 或 64。这是我们的第 5 行。
输出数量
为了检查解决方案,Linpack 基准计算了残差向量r = Ax - b
。向量的最大范数r
是其元素绝对值的最大值max(|r_1|,..,|r_N|)
。这个值称为残值。它应该在机器 epsilon eps
的数量级上,即最小的数字1 + eps > eps
。对于 64 位浮点数eps
约为 1e-15。
为了获得独立于机器架构的度量,计算归一化残差。Linpack 文档给出了标准化残差的以下公式。
|| 斧头 - b ||_oo / ( eps * ( || A ||_oo * || x ||_oo + || b ||_oo ) * n )
这里 || X ||_oo 表示最大范数。看起来很有趣的下标 _oo 代表无穷大符号。那就是|| Ax - b ||_oo 是残差,|| A ||_oo 是矩阵元素的绝对值的最大值,A
|| b ||_oo 是右侧向量的最大绝对值。
符号 || X ||_oo 来自分析。那里|| X ||_1 表示 X 各分量的绝对值之和,|| X ||_1 = |x1| + ... + |xN|。|| X ||_2 = sqrt(|x1|^2 + ... + |xN|^2), || X ||_k = (|x1|^k + ... + |xN|^k)^(1/k)。可以证明当 k 趋于无穷时 || X ||_k 走向max(|x1|,...,|xk|)
。
您还应该看看原来的高性能 LINPACK。