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 21、flang 21和gcc 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 专业版计算节点上编译并运行测试,确保 ssyrk和ssyr2k通过正确性测试,并且性能正确。不要自己实现新的ssyrk或ssyr2k,只需要修复现有代码中的问题。
评测时,会进行如下操作:
- 克隆 OpenBLAS 代码库,checkout 到 v0.3.31 release,使用
patch -p1 < your_patch_file应用你的补丁 - 使用上文提供的编译命令编译 OpenBLAS,能通过测试并编译成功
- 在华为 920 专业版计算节点上,使用步骤 2 得到的 libopenblas.a,编译并运行测试程序,确保
ssyrk和ssyr2k通过正确性测试,并且性能正确
提示¶
提示是不会有提示的,毕竟你是第一个吃螃蟹的人。但我可以告诉你修改很简单,不要想的太复杂,关键是定位问题。
另外,出题人已经给 OpenBLAS 交了个 PR,比赛完会公布。