跳转至

E. 哪里爆了

分数:100 分

背景

新机器总是让人期待,特别是看着美好的纸面参数,想着能跑出多么惊人的性能,幻想着把自己的程序迁移上去,就能解决所有性能问题。但是大部分时候,拿到新机器的第一晚,你一定会苦恼:究竟哪里爆了?

学校新到了一批华为最新最强的 920 专业版计算节点,它拥有两颗 304 核的 ARM V9 处理器,512 位向量宽度,配备了 SME 指令集和非常惊人的 32G HBM 高速内存。你迫不及待尝试把自己的 HPC 代码迁移过去,但发现第一个依赖 OpenBLAS 就编不过去,ssyrk 函数没有通过正确性测试 -- 这正是你程序依赖的核心函数。看着下周的投稿 DDL,你决定尝试修一下这个问题。

任务

解压附件的代码库,这是 OpenBLAS 一月份发布的 v0.3.31 release 。使用下列命令,编译 OpenBLAS,在华为 920 专业版计算节点运行测试之后会得到一个报错,请解决这个报错。用 clang 是因为目前 OpenBLAS 只在 clang 下支持 SME 指令集。

CC=clang CXX=clang++ FC=flang make libs USE_OPENMP=1 TARGET=ARMV9SME -j # 建议在编译机上完成
CC=clang CXX=clang++ FC=flang make tests USE_OPENMP=1 TARGET=ARMV9SME -j4 # 仅供演示报错用,4核编译会花很久,直接在handout里make会快很多
...以上省略
 THE FOLLOWING PARAMETER VALUES WILL BE USED:
   FOR N                   0     1     2     3     7    31
   FOR ALPHA             0.0   1.0   0.7
   FOR BETA              0.0   1.0   1.3

 ROUTINES PASS COMPUTATIONAL TESTS IF TEST RATIO IS LESS THAN   16.00

 SSYRK  PASSED THE TESTS OF ERROR-EXITS

 ******* FATAL ERROR - COMPUTED RESULT IS LESS THAN HALF ACCURATE *******
           EXPECTED RESULT   COMPUTED RESULT
       1      0.462874E-02     -0.183832E-02
       2      0.114351E-01      0.157465E-01
       3     -0.118982E-01     -0.947304E-02
       4     -0.449301E-02      0.626746E-03
       5      0.401996E-02     -0.244710E-02
       6      0.953891E-02      0.138503E-01
       7      0.816167E-02     -0.369461E-02
       8     -0.638922E-02     -0.147425E-01
       9      0.979839E-02      0.138702E-01
      10      0.553692E-02      0.282235E-02
      11      0.626546E-02      0.473852E-02
      12     -0.132754E-01     -0.164990E-01
      13      0.790219E-02      0.119740E-01
      14      0.592614E-02      0.321157E-02
      15     -0.112974E-02      0.633532E-02
      16     -0.151716E-01     -0.991217E-02
      17      0.101597E-02      0.101597E-02
      THESE ARE THE RESULTS FOR COLUMN  17
 ******* SSYRK  FAILED ON CALL NUMBER:
   1732: SSYRK ('U','N', 31,  2, 1.0, A, 32, 0.0, C, 32)           .

 SSYR2K PASSED THE TESTS OF ERROR-EXITS

 ******* FATAL ERROR - COMPUTED RESULT IS LESS THAN HALF ACCURATE *******
           EXPECTED RESULT   COMPUTED RESULT
       1     -0.160742         -0.626985E-01
      THESE ARE THE RESULTS FOR COLUMN   1
 ******* SSYR2K FAILED ON CALL NUMBER:
   1732: SSYR2K('U','N', 31,  2, 1.0, A, 32, B, 32, 0.0, C, 32)    .

 END OF TESTS

运行环境

评测容器镜像:crmirror.lcpu.dev/hpcgame/3rd-kunpeng920:latest,基础发行版为Fedora 43,安装了clang 21flang 21gcc 15

由于 920 专业版数量只有一台,我们限制每个调试容器最多使用 4 核心 CPU,16GB 内存。我们额外提供了鲲鹏 920 高性能版计算节点供你进行编译,最多允许使用 32 核心、 128GB 内存。

如何开始

拿到 handout.tar.gz,放到编译机上,解压得到一个 handout 文件夹。再次解压 OpenBLAS-git.tar.gz 。进入 OpenBLAS,编译出 libopenblas.a 。然后回到 handout 目录,使用提供的 Makefile 编译测试程序:

tar xf handout.tar.gz
cd handout
tar xf OpenBLAS-git.tar.gz
cd OpenBLAS
CC=clang CXX=clang++ FC=flang make libs USE_OPENMP=1 TARGET=ARMV9SME -j
make all -j
# 换成920专业版
make test_ssyrk

提交方式

做出修改,git commit,然后提交这个 commit 的 patch 文件:

git format-patch -1 HEAD # 生成最后一个 commit 的 patch 文件,如果有多个 commit,可以调整 -1 为 -n

测试方法

我们会在代码库 apply 你的 patch 后,在华为 920 专业版计算节点上编译并运行测试,确保 ssyrkssyr2k通过正确性测试,并且性能正确。不要自己实现新的ssyrkssyr2k,只需要修复现有代码中的问题。

评测时,会进行如下操作:

  1. 克隆 OpenBLAS 代码库,checkout 到 v0.3.31 release,使用 patch -p1 < your_patch_file 应用你的补丁
  2. 使用上文提供的编译命令编译 OpenBLAS,能通过测试并编译成功
  3. 在华为 920 专业版计算节点上,使用步骤 2 得到的 libopenblas.a,编译并运行测试程序,确保 ssyrkssyr2k 通过正确性测试,并且性能正确

提示

提示是不会有提示的,毕竟你是第一个吃螃蟹的人。但我可以告诉你修改很简单,不要想的太复杂,关键是定位问题。

另外,出题人已经给 OpenBLAS 交了个 PR,比赛完会公布。

附件