Skip to main content

求解 Ax=b —— 共轭梯度法(上)

· 9 min read

为了进行线性方程组 Ax=bAx=b 的数值求解,这里介绍一种数值求解方法 —— 共轭梯度法(Conjugate gradient method),简称 CG。 共轭梯度法适用于矩阵 AA 是对称正定的情况,如果不考虑计算机处理浮点数的误差,该方法能够给出线性方程组的精确解。

共轭梯度法的条件

为了求解线性方程组(或者说线性系统) Ax=bAx=b,其中 AA 是一个 n×nn\times n 的矩阵,即 ARn×nA \in R^{n \times n}bRnb \in R^nxRnx \in R^n。 此外,还要求矩阵 AA 是对称正定(symmetric position definite,SPD)的,这样才能保证最后共轭梯度法的迭代会收敛到所要求的解。 所谓对称,是指 AT=AA^T = A,即矩阵 AA 的转置等于其本身。 所谓正定,是指 x0\forall x \neq 0,都有 xTAx>0x^TAx>0
可以总结,为了使用共轭梯度法,对矩阵 AA 有如下对约束条件:

  1. 矩阵AA必须是对称矩阵;
  2. 矩阵AA必须是正定矩阵;
  3. 矩阵AA必须是n×nn\times n 的方阵(其中这条已经隐含在条件1和2里面了,因为矩阵的对称和正定都要求矩阵是方阵);

在 CUDA 环境下安装 HIP

· 9 min read

HIP (Heterogeneous-Compute Interface for Portability) 是 AMD 开发的一款异构计算的接口工具。 HIP 允许只用写一套代码(hip代码), 就可以将程序同时在 NVIDIA GPU 和 AMD GPU 及 DCU 上编译运行。

HIP is a C++ Runtime API and Kernel Language that allows developers to create portable applications for AMD and NVIDIA GPUs from single source code.

HIP 的 API 和 CUDA 的API十分类似,例如 CUDA 中内存拷贝用cuMemory, 在 hip 中用hipMemcpy,且参数也十分一致。 因此,会 CUDA 的开发者可以很轻松地转移到 hip 上。 并且,hip 还提供了hipfy 工具,将 CUDA 代码转换为 hip 代码。
HIP 在不降低性能的前提下,统一了CUDA API 和AMD GPU 编程API,可谓极大地降低了各个平台的适配与移植工作, 做到了一套代码,在多个异构平台上运行。 可以说, "舍弃 CUDA,进入HIP时代"。

那么,在 NV GPU下,如何安装并使用 hip 呢?

在神威太湖之光上使用 vscode Remote

· 5 min read

vs code 可谓是开发利器,其中的 vscode-remote 插件给开发者提供了在远程机器上(包括 ssh、docker、WSL)进行开发的选择,且十分便利。 再次之前,我们在太湖之光上编写代码很多时候都是ssh登录到机器到登录节点,然后在命令行下使用 vi 编辑器进行代码编写。 这样的开发方式固然可行,但很多 vscode 的先进功能都没有用上,如代码补全、智能提示、git集成、插件系统。

本文希望将 vscode 的功能给带到太湖之光上,以方便在该机器上的代码开发;通过 vscode 的强大功能来提升工作效率。

在太湖之光上 psn 节点安装 remote-ssh 扩展

本地安装好 Remote-SSH 扩展后,使用该扩展连接 psn 节点,即会开始下载 vscode-serve (由于远程无法连接互联网,会本地下载然后上传到远程)。
如果本地下载上传还是失败,可以参照该链接 手动下载并安装 vscode-serve。
随后的尝试连接 remote 过程会出现失败(可以在 OUTPUT 中查看具体错误信息):

/home/export/base/{my_username}/.vscode-server/bin/{id}/node: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by /home/export/base/{my_username}/.vscode-server/bin/{id}/node)
> /home/export/base/{my_username}/.vscode-server/bin/{id}/node: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.18' not found (required by /home/export/base/{my_username}/.vscode-server/bin/{id}/node)
> /home/export/base/{my_username}/.vscode-server/bin/{id}/node: /usr/lib64/libstdc++.so.6: version `CXXABI_1.3.5' not found (required by /home/export/base/{my_username}/.vscode-server/bin/{id}/node)
> /home/export/base/{my_username}/.vscode-server/bin/{id}/node: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by /home/export/base/{my_username}/.vscode-server/bin/{id}/node)
> /home/export/base/{my_username}/.vscode-server/bin/{id}/node: /lib64/libc.so.6: version `GLIBC_2.17' not found (required by /home/export/base/{my_username}/.vscode-server/bin/{id}/node)
> /home/export/base/{my_username}/.vscode-server/bin/{id}/node: /lib64/libc.so.6: version `GLIBC_2.16' not found (required by /home/export/base/{my_username}/.vscode-server/bin/{id}/node)
> /home/export/base/{my_username}/.vscode-server/bin/{id}/node: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /home/export/base/{my_username}/.vscode-server/bin/{id}/node)

注⚠️:~/.vscode-server/bin/ 下会有一个较长到十六进制字符串的目录,为方便这里用 {id} 代替。

这是由于 spn 节点的linux版本是 red-hat 6,其提供的 glibc 等链接库的版本比较落后, 而 vscode-serve 中的 node 需要 GLIBC_2.17 及以上的 glibc 和高版本的 libstdc++.so。
另外,官方也有相关说明, 要求 RedHat Enterprise Linux 6 (64-bit) 版本需要 glibc >= 2.17 与 libstdc++ >= 3.4.18。