我正在运行线性代数迭代法 (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.12c
N = 10000。
为了找到 c,我对从 1 到 19000 的所有尺寸进行了 MatVecs,绘制了操作数与(维度)^2(操作数 = 斜率 x Dim^2)的图表,其中No. of Operations = Time x 2.13 GHz
. 我将此(线性)图的斜率用作c
。结果是50
。
因此,总时间 = 21.12c = 1000 秒。
因此,假设内存传输和操作同时发生,理论上应该需要 1000 秒。
但实际上,代码最多需要 120 秒。我哪里做错了?我的计算是相当的。