| category | 3.GPU上的并行计算 | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| maxSubmissionCount | 40 | ||||||||||
| maxSubmissionSize | 10485760 | ||||||||||
| metadata |
|
||||||||||
| runnerArgs | |||||||||||
| score | 300 | ||||||||||
| tags |
|
||||||||||
| title | 共轭梯度法 | ||||||||||
| public | false |
在各类数值模拟计算问题中,求解线性方程是一个非常常见且重要的步骤。比如在流体数值计算(CFD)中,我们常常需要求解一个关于流体压力的泊松类型问题:
其中方程的左边是一个压力场
其对应的离散化方程式是:
其中
对上式稍作整理可以发现当格子大小
其中
于是这个问题就被转化为了求解线性方程组的问题。在各类数值仿真中,这样的例子还有很多很多。
共轭梯度法(Conjugate-gradient,以下简称为 CG 方法)是一种求解系数矩阵为对称正定矩阵的线性方程组的迭代解法。假设我们要求解如下的线性系统:
其中
整个共轭梯度法的过程可以用伪代码简单描述如下:
其中
在循环迭代到
Taichi 是一门用于高性能并行计算的新型编程语言。我们给出了一个在 Taichi 语言中的 baseline 实现,选手的目标是基于这个版本进行进一步的优化。关于 Taichi 语言的细节,选手可以参考 Taichi 的官方文档 以及 Taichi 论坛中的简短介绍 。
仓库中共有两个文件和比赛有关,其中 cgsolver.py 包含了求解器的具体实现细节,是选手需要修改的文件;main.py 是用于测试结果运算速度和正确性的脚本,原则上不需要选手修改。选手的任务是找出计算中的 bottleneck 并尽量优化加速。
此次比赛为了方便评测结果,系数矩阵
需要指出,在 baseline 实现中,$b$ 被定义为了一个 2D 且大小为
而系数矩阵 compute_Ap 这个 kernel 隐式地定义了
请直接提交 cgsolver.py。评分程序分别对于如下大小规模的问题进行 5 次运行,取平均耗时作为最终结果:
| 测试点 | 未知数数量 | 重复次数 |
|---|---|---|
| 1 | 256^2 | 5 |
| 2 | 512^2 | 5 |
| 3 | 1024^2 | 5 |
| 4 | 2048^2 | 5 |
运行 repo 中提供的 main.py 文件即可进行简单的计时测试以及结果校验:
$ python3 main.py脚本会自动运行各个测试点的计算,并将 kernel 耗时进行平均后给出。样例输出如下:
>>> Current problem size: 256 x 256
>>> Solving Poisson's equation using CG [1/5]
>>> Conjugate Gradient method converged.
>>> Solving Poisson's equation using CG [2/5]
>>> Conjugate Gradient method converged.
>>> Solving Poisson's equation using CG [3/5]
>>> Conjugate Gradient method converged.
>>> Solving Poisson's equation using CG [4/5]
>>> Conjugate Gradient method converged.
>>> Solving Poisson's equation using CG [5/5]
>>> Conjugate Gradient method converged.
*** Average kernel time: 7.295e+02 msec
>>> Checking the residual norm(Ax-b)...
>>> Residual CGPoissonSolver: 9.57e-09
其中 *** Average kernel time: 后的数字即为选手在此问题上的计时结果(已平均)。


