我的运行时间计算有什么问题?

计算科学 表现 线性代数
2021-12-02 10:23:46

我正在运行线性代数迭代法 (PCG) 来求解 Ax=b,矩阵的维数为 10000x10000。

所以,我做了2个初步分析:

  • 内存分析

矩阵的大小决定了所需的总存储量。这大约是 1E4 x 1E4 = 1E8 个双精度元素,大约是 0.8 GB 的数据。收敛所需的迭代次数为 450。由于这不适合缓存,我假设没有缓存优势,这意味着 450 x 0.8 = 360 GB 的数据传输。内存带宽为 10 GB/s,内存传输大约需要 36 秒。

  • 翻牌圈分析

我计算出每次迭代我将执行 1 个矩阵向量(主导操作),进行 450 次迭代。cN^2操作/迭代 x 450 次迭代 =450c N^2使用 2.13GHz 处理器的操作(确保仅在单个处理器上工作)。那是21.12cN = 10000。

为了找到 c,我对从 1 到 19000 的所有尺寸进行了 MatVecs,绘制了操作数与(维度)^2(操作数 = 斜率 x Dim^2)的图表,其中No. of Operations = Time x 2.13 GHz. 我将此(线性)图的斜率用作c结果是50

因此,总时间 = 21.12c = 1000 秒。

因此,假设内存传输和操作同时发生,理论上应该需要 1000 秒。

但实际上,代码最多需要 120 秒。我哪里做错了?我的计算是相当的。

3个回答

我发现很难相信 c 是 50。理论上,如果矩阵是 N×N,则矩阵向量乘积需要 2N^2 次翻转,这使得 c = 2。在实践中,诸如索引操作、向量化和质量之类的东西的实施影响这一点,但 c = 50 似乎非常高。

此外,假设 PCG = 预处理共轭梯度,您使用哪个预处理器?您确定可以忽略预处理的成本吗?

正如 Jitse 指出的那样,错误显然在于您对成本的估计c. 正如您可能注意到的,用于估计几乎所有计算作为数组大小函数的图表并不是特别线性,由于奇怪的缓存效应而存在很多抖动,并且有几个清晰的区域 L1、L3 和主内存占主导地位。我注意到 Mystical 在您的聊天讨论中也向您指出了这一点

此外,如果您通过直接测量可以很好地估计每个 mat-vec 的成本,则c您正在计算同时考虑内存和触发器/秒。

这种计算的整体情况是混乱的。似乎您正试图深入了解非常精细的性能分析细节,而没有对计算机体系结构和流水线性能有很好的高级理解。你读过 Hennessy 和 Patterson 的计算机体系结构:定量方法吗?

必须在此:操作数 = 时间 x 2.13 GHz,不能以这种方式计算过程中的操作。有许多变量会影响这一点,尤其是您使用的 CPU 类型、热量和并行度。

“处理器的性能或速度取决于时钟频率(通常以赫兹的倍数给出)和每时钟指令数 (IPC),它们共同构成了 CPU 可以执行的每秒指令数 (IPS) 的因素。”

您在这里唯一的变量是时钟频率。

去这里阅读:http ://en.wikipedia.org/wiki/Central_processing_unit#Design_and_implementation