了解 linpack 输入配置

Understanding linpack input configuration

        5                         # number of tests
        1000 2000 3000 4000 5000  # number of equations (problem sizes)
        1000 2008 3000 4008 5000  # leading dimensions
        4 4 2 1 1                 # number of times to run a test (trials)
        4 4 4 4 4                 # alignment values (in KBytes)

我读过documentation,但是2,3,5不清楚(我不懂FORTRAN)。

第 2 行 - 是否要求创建 1000*1000、2000*2000 ... 5000*5000 矩阵?如果是,方程与创建矩阵有什么关系?如果否,该方程式有多复杂 是否简单,如解决 a = 1.2+2.2 或其他一些复杂问题

第 3 行 - 它可能指的是子矩阵。但是创建子矩阵有什么意义呢?如果所有的 LDA 值都等于相应的问题大小会发生什么

第 5 行-对齐值到底是多少?

这是英特尔优化的 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,其中 xb 是 N-dimensional 向量,AN*N矩阵.

N*N 矩阵在内存中表示为 N*N 数组,其中各个列存储在偏移量 0n2*n 等处. 请注意,我们使用不同的符号 n 而不是 N。原因是当 n=N 算法 运行 在几个并行线程中运行时可能 运行 变成一种称为 cache thrashing 的现象。请避免这种情况,建议设置 n>N 在列数据之间插入一些填充。通常选择 n 作为大于 N 的可被 8 整除的最小整数。所以我们完成了第 2 行和第 3 行。第 2 行是 N,第 3 行是 n.

Linpack 基准测试使用多个数组。再次有效地使用缓存,建议让所有数组都从内存页面的边界开始。所以它们与 4k 边界对齐。对于较大的页面,将此值设置为较大的数字可能是有意义的,例如16 或 64。这是我们的第 5 行。

输出数量

为了检查解决方案,Linpack 基准测试计算了残差向量 r = Ax - b。向量的最大范数 r 是其元素绝对值的最大值 max(|r_1|,..,|r_N|)。这个值叫做残值。它应该是 machine epsilon eps 的顺序,即满足 1 + eps > eps 的最小数字。对于 64 位浮点数 eps 大约是 1e-15.

为了获得独立于机器架构的度量,计算归一化残差Linpack documentation 给出了归一化残差的以下公式。

|| Ax - b ||_oo / ( eps * ( || A ||_oo * || x ||_oo + || b ||_oo ) * n )

这里|| X ||_oo 表示最大范数。看起来很有趣的下标 _oo 代表无穷大符号。即|| Ax - b ||_oo 是残差,||一个||_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|).

你也应该看看原文High Performance LINPACK