A. 签到¶
分数:100 分
今年的签到题分两个部分,第一个部分是题目,第二部分是关于比赛以及集群使用的一些信息。提交本题意味着同意第二部分的须知。
如果不方便访问 github, hpcgame cli可以在 QQ 群的群文件里找到。使用 windows 的同学可能需要下载群文件里的kubectl.exe并添加到PATH 。
题目:奇怪的编译¶
猜一猜如下这段代码是什么编程语言?尝试编译,它的输出结果是什么?
在提交页粘贴输出结果即可。
program quine
implicit none
character(len=*), parameter :: code = &
"program quine" // new_line('a') // &
" implicit none" // new_line('a') // &
" character(len=*), parameter :: code = &" // new_line('a') // &
" '!!STRING!!'" // new_line('a') // &
" character(len=1000) :: temp" // new_line('a') // &
" integer :: i, j" // new_line('a') // &
" temp = code" // new_line('a') // &
" j = 1" // new_line('a') // &
" do i = 1, len_trim(temp)" // new_line('a') // &
" if (temp(i:i+9) == '!!STRING!!') then" // new_line('a') // &
" write(*,'(a)',advance='no') code" // new_line('a') // &
" j = i + 10" // new_line('a') // &
" exit" // new_line('a') // &
" else" // new_line('a') // &
" write(*,'(a)',advance='no') temp(i:i)" // new_line('a') // &
" end if" // new_line('a') // &
" end do" // new_line('a') // &
" print '(a)', temp(j:len_trim(temp))" // new_line('a') // &
"end program quine"
character(len=1000) :: temp
integer :: i, j
temp = code
j = 1
do i = 1, len_trim(temp)
if (temp(i:i+9) == '!!STRING!!') then
write(*,'(a)',advance='no') code
j = i + 10
exit
else
write(*,'(a)',advance='no') temp(i:i)
end if
end do
print '(a)', temp(j:len_trim(temp))
end program quine
前言¶
今年我们的集群结构与去年类似,吸取了去年的教训,我们希望今年集群更加易用。
本次比赛我们使用基于容器的方案,使用 Kubernetes 集群管理容器,选手可以自由选择容器镜像,配置容器环境,使用容器内的 root 权限。
如何获取帮助¶
请及时加入 QQ 群 679550783,获得消息推送、反馈问题。你可以联系管理员,或者在群里提问。管理员会在比赛期间保持在线,尽力解决问题。注意,在群里提问时请不要交流题目的想法和答案。
管理员用 @标签表示负责的范围。请尽量按照标签联系管理员,以便快速解决问题。如果不知道该联系哪位,请联系标签为 @其他 的同学,或者群主。
由于环境复杂,本次集群必然有许多不足之处,我们在赛前进行了一些测试,但是没有办法覆盖所有情况。如果在比赛中遇到任何问题,请及时联系管理员,我们会尽力解决。
参赛须知¶
如何提交题目¶
选中赛题,转到提交栏即可提交。

WriteUp 提交¶
所有获得奖项的选手需在比赛结束后 48 小时内(2026 年 2 月 10 日晚 23:59 之前)提交 WriteUp 。 WriteUp 需要包含以下内容:
- 每一道得分超过 10% 的题目的简要思路、简要过程
- 如果直接使用了开源代码、互联网代码,请提交对应的代码来源
- WriteUp 提交方式将与获奖信息收集同时发送至获奖选手邮箱。
WriteUp 不参与评分,只用于反作弊。如果没有及时提交 WriteUp 、或者 WriteUp 可疑,组委会有权在充分公示的前提下取消选手的获奖资格、后续选手将递补名额。
参赛须知¶
- 不得作弊。比赛是个人赛,任何多人合作完成比赛的行为都将被认为作弊。组委会在多处设置了作弊检查点,并将进行代码查重,希望大家诚信比赛,赛出风采。
- 不得攻击网站和比赛集群。本比赛不是 CTF,不考察任何形式的平台攻击。如果我们发现任何攻击行为,选手将会被除名。如果您发现任何 Bug 或可能的安全漏洞,请您与我们联系,我们会给予充分奖励,但不包括比赛分数上的奖励。
- 赛题分批次放出。我们计划分三天,在 2 月 1 、 2 和 3 日释出部分未释出的试题,释出顺序与题目难度无关。
- 比赛的所有题目场景均为虚构,不反映现实或历史。所有人物均为虚拟人物,并非真实人物的对应。
- 请勿滥用平台计算资源,一经发现,立即封号。开启 VSCode 任务时,请最多分配 2 核心 CPU(CPU 分区) / 1 块 GPU(GPU 分区)。这足够您的使用。否则我们会直接结束您的任务。
隐私协议¶
- 我们(北京大学高性能计算综合能力竞赛组委会)高度重视您的隐私,将会采取一切必要措施保护您的隐私安全;
- 在比赛过程中我们会收集您的个人信息、做题情况等信息。这些信息只供本次比赛所用,赛后您可要求组委会永久删除;
- 我们可能会将您的部分个人信息(姓名、电话、邮箱等)提供给赞助商作为招聘等用途。组委会与赞助商约定,如您无回复,每半年最多打扰您一次。如您不同意本条,可以发送主题为 "HPCGame+邮箱+不同意校招信息分享" 的邮件至 hpcgame@pku.edu.cn,我们将不会分享您的信息。
- 对于本协议的最终解释权归组委会所有。
HPCGame CLI 使用指南¶
为了方便大家使用 HPCGame 平台,我们开发了 hpcgame cli小工具,为大家提供类 docker 的使用体验。同时,我们依然支持使用kubectl和kubeui 连接集群,但我们不保证这两者的使用体验。
本指南面向 HPCGame 参赛选手,帮助你从零开始配置环境、创建容器并完成比赛任务。 CLI 工具封装了 Kubernetes 的底层操作,同时提供原始命令和 Docker 风格命令两套接口,你可以按自己的习惯选择。集群的 webui 在:https://hpcgame.pku.edu.cn/kube/_/ui/#/ ,你可以在这里获取 kubeconfig 。
1. 下载 CLI¶
前往 Releases 页面 下载最新版本,根据你的操作系统和架构选择对应的压缩包:
| 操作系统 | 架构 | 文件名 |
|---|---|---|
| Linux | x86_64 | hpcgame-linux-amd64.tar.gz |
| Linux | ARM64 | hpcgame-linux-arm64.tar.gz |
| macOS | Intel | hpcgame-darwin-amd64.tar.gz |
| macOS | Apple Silicon | hpcgame-darwin-arm64.tar.gz |
| Windows | x86_64 | hpcgame-windows-amd64.zip |
Linux / macOS¶
# 以 Linux x86_64 为例,请根据实际情况替换文件名
wget https://github.com/lcpu-club/hpcgame-kube-cli/releases/latest/download/hpcgame-linux-amd64.tar.gz
tar -xzf hpcgame-linux-amd64.tar.gz
chmod +x hpcgame
# 将二进制文件移到 PATH 中(可选)
sudo mv hpcgame /usr/local/bin/
Windows¶
下载 hpcgame-windows-amd64.zip后解压,将hpcgame.exe所在目录添加到系统环境变量PATH 中,或直接在解压目录下使用。
验证安装成功:
hpcgame version
# 输出示例:HPCGame CLI version 0.5.1
2. 初始化环境¶
运行 install 命令完成一站式初始化:
hpcgame install
该命令会依次完成以下操作:
- 检查并安装 kubectl:如果系统中尚未安装 kubectl,CLI 会引导你完成安装。在 Linux 上你可以选择安装到
/usr/local/bin(需要 sudo)或~/.hpcgame/bin(无需 root 权限,CLI 会帮你添加到 PATH)。 - 输入并验证 kubeconfig:前往比赛平台 https://hpcgame.pku.edu.cn/kube/_/ui/#/tokens/ 获取你的 kubeconfig 内容,粘贴到终端后按
Ctrl+D(Linux/macOS)或Ctrl+Z(Windows)结束输入。 CLI 会自动验证其有效性并保存到~/.hpcgame/kubeconfig。 - 安装 VSCode 扩展(可选):如果检测到
code命令,会自动安装 Kubernetes Tools 和 Remote Containers 扩展。 - 拉取分区信息:从服务器获取可用的计算分区列表并展示。
提示:kubeconfig 是你访问集群的凭证,请妥善保管,不要泄露给他人。
3. 查看可用资源¶
查看分区¶
hpcgame lspart
输出会列出每个分区的名称、 CPU/内存上限、可用 GPU 型号以及预置镜像列表。创建容器时需要指定分区名称,请先熟悉各分区的资源配额。
查看镜像¶
hpcgame images
按分区列出所有预验证的镜像。你也可以使用自定义镜像,只要它与目标分区兼容即可。
4. 创建容器¶
CLI 提供两种等价的创建方式,功能完全相同。特别注意,容器的默认运行时长是 2 小时,如果有需要的话,可以使用 -d指定最长运行时间,以秒为单位。容器本身不是持久化的,只有/partition-data 文件夹中的内容会持久保存。
方式一:create 命令¶
hpcgame create -p wm2_8358 -c 4 -m 8 -n my-container -i cr.hpc.lcpu.dev/hpcgame/base:latest
方式二:run 命令(Docker 风格)¶
hpcgame run -p wm2_8358 -c 4 -m 8 -n my-container cr.hpc.lcpu.dev/hpcgame/base:latest
两者的区别仅在于 run可以将镜像名作为最后一个位置参数传入,而create需要用-i 指定。
参数说明¶
| 参数 | 短写 | 说明 | 默认值 |
|---|---|---|---|
--partition | -p | 分区名称 | 交互式选择 |
--cpu | -c | CPU 核心数 | create 交互式输入;run 为 1 |
--memory | -m | 内存大小(GiB) | CPU × 2 |
--gpu | -g | GPU 数量 | 0 |
--image | -i | 容器镜像 | 分区的第一个预置镜像 |
--name | -n | 容器名称 | 自动生成 |
--volume | -v | 额外挂载的持久卷(逗号分隔) | 无 |
交互式创建¶
如果省略必要参数,CLI 会进入交互模式逐步引导你完成选择:
hpcgame create
# 会依次提示你选择分区、输入 CPU 核数等
挂载额外持久卷¶
hpcgame run -p wm2_8358 -c 4 -m 8 -v my-data,shared-data -n my-container cr.hpc.lcpu.dev/hpcgame/base:latest
额外指定的卷会挂载到 /mnt/<卷名>,例如上面的my-data会出现在/mnt/my-data 。
注意:每个分区会自动创建并挂载一个默认持久卷到
/partition-data,这也是容器的默认工作目录。你的数据放在这里可以跨容器保留。
5. 管理容器¶
查看容器列表¶
hpcgame ls # 或 hpcgame ps
输出包含容器名称、镜像、状态、创建时间和所在节点。
连接到容器终端¶
hpcgame shell my-container # 原始命令
hpcgame exec -it my-container bash # Docker 风格
两者效果相同,都会打开一个交互式 bash shell 。
在容器中执行命令(不进入 shell)¶
hpcgame exec my-container ls -la /partition-data
删除容器¶
hpcgame delete my-container # 或 hpcgame rm my-container
6. 文件传输¶
使用 cp命令在本地和容器之间复制文件,语法与docker cp 一致:
# 本地 → 容器
hpcgame cp ./input.txt my-container:/partition-data/input.txt
# 容器 → 本地
hpcgame cp my-container:/partition-data/output.txt ./output.txt
如果省略容器内的目标路径,文件默认会复制到 /partition-data:
hpcgame cp ./data.csv my-container:
注意:文件传输需要容器处于 Running 状态。
7. 端口转发¶
将容器内的服务端口映射到本地,方便在浏览器或本地工具中访问:
hpcgame portforward my-container 8080:80 # 或 hpcgame port my-container 8080:80
上面的命令将容器的 80 端口映射到本地的 8080 端口。运行后终端会保持前台占用,按 Ctrl+C 停止转发。
典型场景:在容器中启动 Jupyter Notebook(默认 8888 端口),然后在本地用浏览器访问 http://localhost:8888:
hpcgame port my-container 8888:8888
8. 持久卷管理¶
持久卷用于在容器之间共享和保留数据。
查看所有卷¶
hpcgame volume ls
输出包含卷名、大小、存储类、访问模式和状态。名称中包含 -default-pvc 的是分区默认卷,不可删除。
创建新卷¶
hpcgame volume create my-data 10Gi yanyuan-nfs ReadWriteMany
参数依次为:卷名、大小、存储类(StorageClass)、访问模式(可选,默认 ReadWriteMany)。存储类需要与你使用的分区匹配,可以通过hpcgame volume ls 查看已有卷的存储类作为参考。
删除卷¶
hpcgame volume rm my-data
注意:删除卷是不可逆操作,卷中的数据会永久丢失。
9. 完整命令速查表¶
| 命令 | Docker 等价命令 | 说明 |
|---|---|---|
hpcgame install | — | 初始化环境 |
hpcgame lspart | hpcgame images | 查看分区/镜像 |
hpcgame create | hpcgame run | 创建容器 |
hpcgame ls | hpcgame ps | 查看容器 |
hpcgame shell <name> | hpcgame exec -it <name> bash | 进入容器 |
hpcgame exec <name> <cmd> | 同左 | 执行命令 |
hpcgame cp <src> <dst> | 同左 | 文件传输 |
hpcgame portforward <name> <ports> | hpcgame port <name> <ports> | 端口转发 |
hpcgame delete <name> | hpcgame rm <name> | 删除容器 |
hpcgame volume ls | 同左 | 查看卷 |
hpcgame volume create | 同左 | 创建卷 |
hpcgame volume rm | 同左 | 删除卷 |
hpcgame version | — | 查看版本 |
hpcgame help | — | 查看帮助 |
10. 常见问题¶
Q:提示 "Kubeconfig not found",怎么办? 运行 hpcgame install 完成初始化,确保已正确粘贴 kubeconfig 。
Q:容器创建后一直没有变成 Running 状态? 用 hpcgame ls 查看状态。如果长时间处于 Pending,可能是分区资源不足,尝试减少 CPU/内存/GPU 的请求量,或者更换分区。遇到问题,请联系管理员。
Q:windows 防病毒会扫描 hpcgame cli,很慢,怎么办? 把 windwos defender 关掉。
Q:不同分区的容器能共享数据吗? 使用相同 StorageClass 的分区(也就是在同一个机房的节点,比如燕园、未名 2 号)会共享同一个默认持久卷(/partition-data)。你也可以创建额外的持久卷并在不同容器中挂载。
Q:我可以使用自定义镜像吗? 可以。只要镜像与分区的节点架构兼容,就可以通过 -i 参数指定任意镜像地址。
Q:如何调试容器启动问题? 设置环境变量 DEBUG=1 后重新创建容器,CLI 会输出生成的 Pod YAML 配置,便于排查:
DEBUG=1 hpcgame create -p x86 -c 2 -m 4 -n debug-test
如有更多问题或建议,请在 GitHub Issues 提交反馈,或者联系管理员。
镜像¶
为了方便大家使用,我们提供了许多预构建的镜像,位于 cr.hpc.lcpu.dev。你可以通过docker pull cr.hpc.lcpu.dev/hpcgame/xxx下载镜像,使用latest 标签即可。
我们提供了以下镜像:
默认镜像¶
默认镜像是推荐使用的开发镜像,包含了常用的工具和库,可以在所有架构上使用。默认镜像名称为 base 。
特定镜像¶
如下镜像只能在特定架构上使用:
- cuda:使用 cuda 12.9,只能在 amd64 架构上使用,支持 A100 等 NVIDIA GPU 环境。
- rocm-prefill:使用 ROCm 7.2,只能在 amd64 架构上使用,支持 W7800 等 AMD GPU 环境。
- 3rd-kunpeng920:基于
fedora 43的镜像,预装clang 21,flang 21,gcc 15,适用于鲲鹏 920 开发。
镜像缓存¶
该站还提供以下镜像 registry 的缓存:
- docker.io
- gcr.io
- ghcr.io
- quay.io
可以使用类似如下命令使用:
docker pull cr.hpc.lcpu.dev/docker.io/library/hello-world:latest