2025 PKU HPCGame WP
今年如约参加了第二届 PKU HPCGame,精彩的题目和更加易于使用的集群环境的更新让人耳目一新,尤其是画板题目的各种梗(
(Neuro Sama,Techmino,tetr.io,还有未画完的芙兰都是我画的)
本次比赛的一大遗憾是最后才发现 PVC 挂载到 root 时会导致 .bashrc 被覆盖导致 module 环境变量丢失,间接导致 J 题没有做出来。但总体来说,成绩比去年稍微好一些,还需要继续努力。本次比赛首次设置了 WriteUp 的提交,因此正好方便了我整理这篇文章。
A. 签到 (100/100)
题目
今年的签到题竟然是阅读理解,怎么回事呢,我们一起来看看吧。
为了保证大家基本读完,本题需要提交四位数字,读文档的同时大家就能发现(这些提示都是斜体!)。
题解
注意到是 1898 。
B. 小北问答 (100/100)
题目
- 鸡兔同笼
(填数字)
某厂的CPU采用了大小核架构,大核有超线程,小核没有超线程。已知物理核心数为12,逻辑核心数为16,大核数量为____,小核数量为____。
- 编程语言
(填“是”或者“否”)
C语言中,假设有函数 void f(const void **p);,我们有 void **q;,请问不使用强制类型转换,直接调用 f(q) 是否符合 C 的规范?
- CPU Architecture
(填数字)
ARM架构的sve2指令集具有可变向量长度,且无需重新编译代码,就可以在不同向量长度的硬件上运行。sve2指令集的最小硬件向量长度是____,最大硬件向量长度是____。
- MISC
(填数字)
fp4 是一种新的数字格式,近期发布的许多硬件都增加了对 fp4 的支持。SE2M1(一位符号,两位 exponent,一位 mantissa)条件下,fp4 能精确表示的最大数字是____,能精确表示的最小的正数是____。
【注意,模仿IEEE风格或OCP Microscaling Formats标准的结果都视为正确答案】
- 储存
(填写字母,字母之间不要空格)
ZNS(Zoned Namespaces)SSD是一种新型储存设备,关于传统SSD与ZNS(Zoned Namespaces)SSD的行为差异,以下哪些说法是正确的?(多选)
A. 当写入一个已有数据的位置时,传统SSD会直接原地覆盖,而ZNS SSD必须先执行Zone Reset操作
B. 传统SSD的FTL会维护逻辑地址到物理地址的映射表,而ZNS SSD可以显著简化或消除这个映射过程
C. 当可用空间不足时,传统SSD会自动触发垃圾回收,而ZNS SSD需要主机端主动管理并执行显式擦除
D. 传统SSD一般支持任意位置的随机读取,而ZNS SSD只支持顺序读取
E. 传统SSD通常需要较大比例的预留空间(Over-Provisioning),而ZNS SSD可以将这部分空间暴露给用户使用
- OpenMPI
(填写patter为x.y.z,版本号的前缀v省略)
OpenMPI 是一个开源的消息传递接口 (MPI) 实现,在高性能计算领域被广泛使用。截至2025年1月18日,OpenMPI 发布的最新稳定版本为 _____,在此版本的 OpenMPI中内置使用的 PRRTE 的版本为 _____。大家可以了解一下PRRTE的作用,OpenMPI 4 到 5 的架构变化,还挺有趣的。
- RDMA
(填写字母,字母之间不要空格)
RDMA 是一种高性能网络通信技术,它允许计算机直接访问远程内存,从而大大降低了通信延迟和 CPU 开销。目前,主流的 RDMA 实现包括 InfiniBand、RoCE、RoCEv2 和 iWARP。下图中从左到右的四列展示了四种 RDMA 实现的架构图,请你说出按照从左到右的顺序,说出下图中的四列分别对应了什么 RDMA 的实现架构_____。
A: RoCE B: RoCEv2 C: iWARP D: InfiniBand
- HPCKit
(填数字序号,数字之间不要空格)
HPCKit 是针对鲲鹏平台深度优化的HPC基础软件,请选择以下组件的具体作用。
A. BiSheng B. HMPI C. KML D. KBLAS E. EXAGEAR
选项:
高性能数学计算加速库
基础线性代数过程库
高性能通信库
X86到ARM的二进制指令动态翻译软件
编译器套件
9. CXL
(填数字,保留两位有效数字)
在传统的AI/ML计算中,模型训练和推理通常涉及大量的数据传输,尤其是在需要在CPU和GPU之间频繁交换数据时。例如,一个深度学习模型的训练任务可能包含以下步骤:
数据加载和预处理在CPU上完成。
预处理后的数据从CPU传输到GPU进行训练计算。
训练完成后,模型更新结果传回CPU进行后续处理。
假设有以下条件:
每次批处理需要传输的数据量为1GB。
GPU每秒钟可以完成10次这样的批处理。
传统架构下,CPU到GPU的PCIe传输延迟为50μs,传输带宽为10GB/s。
CXL架构下,传输延迟降至10μs,且数据访问可直接完成,无需显式传输。
假设总训练任务包含10000次批处理。比较传统架构和CXL架构下完成任务所需的总时间,计算加速比(传统架构时间 / CXL架构时间),保留两位有效数字。
(该题基于理想化模型,与真实情况并非完全符合)
- 量子计算
(填数字,小数形式)
量子计算是一种基于量子力学原理的计算方式,它利用量子比特的叠加态和纠缠态来进行计算,被认为是下一代计算技术。加速量子计算的模拟、数据处理等负载也是目前高性能计算领域的热点之一。
初始状态为∣0⟩的量子比特,经过一次Hadamard门(H门)操作后,测量得到∣0⟩的概率是______?经过两次Hadamard门(H门)操作后,测量得到∣0⟩的概率是______?
题解
- 4 8 (大核双线程)
- 否
- 128 2048 (Introduction to SVE2 - Arm Developer)
- 3 0.5 (AI给了几个数字,试过去的)
- BCE
- 5.0.6 3.0.7
- DABC (注意到最右边是C,最左边是D)
- 53124 (注意到bisheng是编译器,kml是数学库,kblas是线代库)
- 2.0 (注意到传统架构单次批处理0.2s,CXL是0.1s)
- 0.5 1.0 (注意到两次H门操作抵消)
C. 不简单的编译 (100/100)
题目
众所周知,HPC领域中常用的、性能比较好的语言有 C, C++, Fortran。这些语言常用的编译器有五款,其中 AMD, Intel, NVIDIA 御三家各维护了一款编译器,而开源社区维护了 GNU 和 LLVM 两款编译器。
现在有这么一个涉及了三种语言的计算卷积的小项目(见附件)
handout/
├── CMakeLists.txt
├── filter.F90
└── main.cpp
使用合适的编程语言、编译器、编译选项编译这个项目,让它跑快一点。
你可以修改CMakeLists.txt、filter.F90并提交,提交时你可以从五家编译器中选择用你喜爱的一家。
题解
根据题意,使用 intel 编译器,修改 CMakeLists.txt 为:
1 | cmake_minimum_required(VERSION 3.20) |
根据文件给出代码,尝试先将代码循环进行优化,减少计算量。
在内层循环外预先计算索引偏移,减少频繁 (i - is) 计算。
在内层循环中使用局部指针或引用,以减少反复的数组引用开销。
避免重复读写数据,可将 wgt[j] 与 x[j] 块状读取后再计算。
1 | void filter_run(double x[113][2700], double wgt[113][1799], int ngrid[113], int is, int ie, int js, int je) |
D. 最长公共子序列 (100/100)
题目
给定两个序列,长度分别是len1和len2,输出他们最长公共子序列的长度。
题解
根据题目 baseline ,注意到循环中内存命中率不高,进行循环展开。添加简单的 OpenMP 并行化,根据使用习惯将循环调整至从零开始。
碎碎念:类似于去年的矩阵运算?
1 |
|
E. 着火的森林 (150/150)
题目
模拟一个 n*n 的森林,并计算变化后的森林。
题解
根据题目要求,首先构建模拟代码,然后根据题目要求进行多线程优化,使用 MPI 进行多机优化,将森林分块进行计算,最后将结果合并。
代码使用 AI 辅助完成。
1 |
|
F. 雷方块 (10/200)
题目
给定一个由 0,1,2,3 这四个数构成的矩阵,代表由三种状态的方块构成的阵列,其中 0 表示空缺,1,2,3 分别为三种状态。 敲击一个方块会使这个方块和相邻四个位置中的方块按照 (1, 2, 3) 的顺序轮回。 求解每个方块需要敲击多少次能让全部方块状态变成3。
注意到一个方块连续敲三次整体状态还原。
题目保证在每个方块敲击次数不超过2的情况下具有唯一解。
题解
注意到这是有三个状态的关灯问题,题目提示使用 LU 分解或高斯消元法,本代码使用高斯消元法解决,该代码参考样例代码编写,由 AI 辅助完成。由于算法性能较差,得分仅5%。
1 |
|
G. TopK (200/200)
题目
小 T 最近在学习并行计算,他发现在大规模数据处理中,寻找最大的 K 个元素是一个非常常见的需求。比如在搜索引擎中,需要找出最相关的前 K 个结果;在推荐系统中,需要推荐最匹配的 K 个商品。
小 T 想要实现一个高效的 Top-K 算法,他希望你能帮助他完成这个任务。而 Julia 最近在科学计算领域,因其方便的并行计算和高性能的特性,受到了越来越多的关注。所以小 T 希望你使用 Julia 语言来实现这个算法,并尽可能地优化其性能。
给定一个包含 N 个数(整数或浮点数)的数组,找出其中最大的 K 个数。
你需要实现一个签名为 topk(data, k) 的函数,其中 data 是一个包含 N 个数(整数或浮点数)的数组,k 是一个正整数。
函数的返回值是一个包含 K 个整数的数组,这 K 个数是输入数组中最大的 K 个数的下标(从 1 开始),且应当按照下标对应数值从大到小排序。如果输入数组中存在多个相同的数,则下标小的优先。
你不需要考虑文件输入或输出,只需要实现 topk 函数。评测程序将会调用你的实现进行评测。
题解
根据题目要求,使用 Julia 语言实现 Top-K 算法,使用最小堆维护序列,并输出 K 大的元素,算法流程:
graph TD
A[输入数据和k] –> B[数据分块]
B –> C[并行处理每个块]
C –> D[维护局部k大小的最小堆]
D –> E[合并所有局部结果]
E –> F[构建最终结果数组]
代码使用多线程优化,并行化处理:
1 | chunk_size = ceil(Int, n / nthreads()) |
使用 @inbounds 避免边界检查, @simd 启用向量化,代码由 AI 辅助完成。
1 | using Base.Threads |
H. Posit GEMM (0)
题目
在本题中,你将用 CUDA 处理 64 位,es=3 的 posit number 的矩阵乘法。为了数值稳定性和实现方便,我们保证输入的矩阵是从 [−2+ϵ,2−ϵ] 中均匀随机选取的。
你需要在 impl.cu 中实现函数 void cuda_posit_gemm_d(const uint64_t *dA, const uint64_t *dB, uint64_t *dC, int n, int m, int k),表示执行 C = AB,dA, dB, dC 是三个 GPU global memory 上的数组,按 row major 存储。A, B, C 的形状分别为 n x k, k x m, n x m。
题解
无
I. 刀锐奶化 (32/200)
题目
题解
根据 baseline 程序,将其转换为 .cu 程序,由于未进行有效优化,本题得分率不高。
1 | #include <math.h> |
J. HPL-MxP (5.69/100)
题目
HPL-MxP 也叫 HPL-AI,旨在使用充分利用 fp16 等精度较低的硬件进行 fp64 计算,提高 HPL 的性能。
本题介绍的是用 32 位浮点数实现的 HPL-MxP,这也是 HPL-MxP 的官方实现。你可以使用任意方法进行加速。
评测容器镜像:hpckit。程序运行在配备 Kunpeng 920 处理器的服务器上,可以使用 2 个核心,10G内存。保证 module 命令可用,没有加载任何模块,请在run.sh中加载自己所需的环境。
题解
HPCGame 偶遇 hpl-ai,拼尽全力无法战胜。提交 baseline 代码,未进行有效优化。
K. 画板 (50/50)
题目
小鸣最近迷上了区块链,他发现每个人的密钥地址是一个以”0x”开头的42位十六进制字符串,例如:
0x7d1a13c226F9951F44392a5446dF518bAE240cFe
作为一个极客,小鸣想要一些特殊的靓号地址。比如他想要一个以”888”开头的密钥地址,那就是类似:
0x888xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
这样的地址。
生成一个密钥n地址的过程是:
- 随机生成一个32字节的私钥
- 用椭圆曲线算法(secp256k1)根据私钥生成公钥
- 取公钥的Keccak-256(SHA3)哈希值的后20字节作为地址
你的任务是帮助小鸣寻找他想要的靓号。
题解
尝试在 baseline 基础上寻找优化的方式,包括OpenMP 并行化,进行批处理,预先分配内存优化内存开销,使用原子操作保护共享资源。每个线程使用独立的随机数生成器,避免竞争。
代码部分由 AI 辅助完成。
1 |
|
L. EDA (20/200)
题目
FLUTE(Fast Lookup Table Based Rectilinear Steiner Minimal Tree Algorithm)是一种基于查找表的快速RSMT算法,专门用于VLSI设计中的低度网络(即引脚数量较少的网络)。FLUTE的核心思想是通过预计算的查找表来快速构建RSMT,从而在保证高精度的同时,显著提高计算速度。
本项目的目标是加速FLUTE算法。
题解
使用 intel 环境,启用 -xHost 优化,提交 baseline 代码,未进行有效优化。
总结
ID: Neur0_5ama
分数:867.69 | 总榜:48 | 校外榜:27
本次体验下来觉得集群系统使用方式的焕新非常有益,确实能够提高使用的效率,非常感谢比赛运维大佬们的帮助。还是上次的结尾:总之还是要多多学习,明年再来。 /heart
2025 PKU HPCGame WP