跳转至

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 可疑,组委会有权在充分公示的前提下取消选手的获奖资格、后续选手将递补名额。

参赛须知

  1. 不得作弊。比赛是个人赛,任何多人合作完成比赛的行为都将被认为作弊。组委会在多处设置了作弊检查点,并将进行代码查重,希望大家诚信比赛,赛出风采。
  2. 不得攻击网站和比赛集群。本比赛不是 CTF,不考察任何形式的平台攻击。如果我们发现任何攻击行为,选手将会被除名。如果您发现任何 Bug 或可能的安全漏洞,请您与我们联系,我们会给予充分奖励,但不包括比赛分数上的奖励。
  3. 赛题分批次放出。我们计划分三天,在 2 月 1 、 2 和 3 日释出部分未释出的试题,释出顺序与题目难度无关。
  4. 比赛的所有题目场景均为虚构,不反映现实或历史。所有人物均为虚拟人物,并非真实人物的对应。
  5. 请勿滥用平台计算资源,一经发现,立即封号。开启 VSCode 任务时,请最多分配 2 核心 CPU(CPU 分区) / 1 块 GPU(GPU 分区)。这足够您的使用。否则我们会直接结束您的任务。

隐私协议

  1. 我们(北京大学高性能计算综合能力竞赛组委会)高度重视您的隐私,将会采取一切必要措施保护您的隐私安全;
  2. 在比赛过程中我们会收集您的个人信息、做题情况等信息。这些信息只供本次比赛所用,赛后您可要求组委会永久删除;
  3. 我们可能会将您的部分个人信息(姓名、电话、邮箱等)提供给赞助商作为招聘等用途。组委会与赞助商约定,如您无回复,每半年最多打扰您一次。如您不同意本条,可以发送主题为 "HPCGame+邮箱+不同意校招信息分享" 的邮件至 hpcgame@pku.edu.cn,我们将不会分享您的信息。
  4. 对于本协议的最终解释权归组委会所有。

HPCGame CLI 使用指南

为了方便大家使用 HPCGame 平台,我们开发了 hpcgame cli小工具,为大家提供类 docker 的使用体验。同时,我们依然支持使用kubectlkubeui 连接集群,但我们不保证这两者的使用体验。

本指南面向 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

该命令会依次完成以下操作:

  1. 检查并安装 kubectl:如果系统中尚未安装 kubectl,CLI 会引导你完成安装。在 Linux 上你可以选择安装到 /usr/local/bin(需要 sudo)或~/.hpcgame/bin(无需 root 权限,CLI 会帮你添加到 PATH)。
  2. 输入并验证 kubeconfig:前往比赛平台 https://hpcgame.pku.edu.cn/kube/_/ui/#/tokens/ 获取你的 kubeconfig 内容,粘贴到终端后按 Ctrl+D(Linux/macOS)或Ctrl+Z(Windows)结束输入。 CLI 会自动验证其有效性并保存到~/.hpcgame/kubeconfig
  3. 安装 VSCode 扩展(可选):如果检测到 code 命令,会自动安装 Kubernetes Tools 和 Remote Containers 扩展。
  4. 拉取分区信息:从服务器获取可用的计算分区列表并展示。

提示: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 21flang 21gcc 15 ,适用于鲲鹏 920 开发。

镜像缓存

该站还提供以下镜像 registry 的缓存:

  • docker.io
  • gcr.io
  • ghcr.io
  • quay.io

可以使用类似如下命令使用:

docker pull cr.hpc.lcpu.dev/docker.io/library/hello-world:latest