记录各种奇怪的bug和解决过程。 “事件簿”是因为debug时抽丝剥茧的过程和阅读推理小说有异曲同工之处。

MPI, blacs and blas


2023/7/9 blas中的leading dimension的含义

  • 作为输出(ldc):M行N列的矩阵,官方文档给出ldc=M. 也就是说,blas是行优先,即行index在内,列index在外。(一列一列地访问,和一般人习惯相反)
  • 作为输入(lda, ldb):对应index处于最内层的维度,或者说在线性index的情况下从0开始连续取最多n个元素属于同一维(下一个元素就是另一个维度了),这个n是多少。 M行N列的矩阵,当trans=’N’时,代表M在index内层;当trans=’T’时,代表N在index内层。
    例如:一个数组按地址顺序元素为[1, 2, 3, 4, 5, 6],取M=2, N=3让它表示一个2行3列的矩阵。根据“行index在内”的规则,如果trans=‘N’, 它代表
    \(\begin{bmatrix} 1&3&5\\ 2&4&6 \end{bmatrix}\)
    如果trans=‘T’, 表示转置后的矩阵是
    \(\begin{bmatrix} 1&4\\ 2&5\\ 3&6 \end{bmatrix}\)
    也就是说,原矩阵是\(\begin{bmatrix} 1&2&3\\ 4&5&6 \end{bmatrix}\)

2023/7/7

  • 加了一个输入参数忘记bcast,程序卡死。后来每个进程分别输出,发现只有0号进程跑了后续流程,才找出这个问题。 (ChatGPT:)这种时候可以用gdb attach到进程上,然后用bt查看调用栈,找到卡死的进程,然后用frame命令切换到卡死的进程,然后用info locals查看局部变量,找到卡死的原因。
  • descinit_报错:“{ -1, -1}: On entry to DESCINIT parameter number 6 had an illegal value” 。ChatGPT说是因为没有正确初始化通信上下文。
    • 调用Cblacs_pinfo得到进程信息,发现Cblacs_pinfo竟然给出了进程数为-1。
    • 找到原因:前面有析构函数调用了Cblacs_exit(1),删除了blacs环境。
    • 调用Cblacs_setup重新初始化不起作用:官方文档说除了PVM-blacs(Parallel Virtual Machine blacs)外,其他情况调这个函数没用(等同于Cblacs_pinfo,只输出不输入),因为blacs会假定系统的进程数是固定的。
    • 修改:在合理位置调用Cblacs_exit。其中Cblacs_exit(0)会同时终止MPI,Cblacs_exit(1)则不会。