G. 3D 生命游戏¶
分数:200 分
简介¶
康威生命游戏(Conway's Game of Life),是英国数学家约翰・何顿・康威在 1970 年发明的细胞自动机。
在初始版本的生命游戏中,世界是一个二维的方格矩阵,其中,每个方格中居住着存活或者死亡的细胞。一个细胞在下一时刻的生死取决于相邻的八个方块中居住的存活或者死亡的细胞的数量,具体规则如下:
- 当细胞为存活状态时
- 如果周围存活的细胞低于 2 个(不包含 2 个)时,细胞变为死亡状态
- 如果周围存活的细胞有 2 个或者 3 个,则细胞保持存活
- 如果周围存活的细胞超过 3 个(不包括 3 个)时,细胞变为死亡状态
- 当细胞为死亡状态时
- 如果周围有 3 个存活细胞时,该细胞变成存活状态
重复以上过程,康威生命游戏便可周而复始地进行。由于规则简单,又能产生一些有趣的现象,生命游戏的生命力经久不衰。你可以在 这个网站 玩到原版的生命游戏。默认的场景就是一个不断向外运输块的“太空船”,就好像人类发射火箭,探索太空一样。观察这些现象的时候,仿佛我们就是造物主,看着芸芸众生忙碌奔波。
3D 版本康威生命游戏¶
在本题中,你将研究拓展到三维版本的康威生命游戏。在三维版本中,每个细胞有 26 个邻居,状态转移规则如下:
- 当细胞为存活状态时
- 如果周围存活的细胞低于 5 个(不包含 5 个)时,细胞变为死亡状态
- 如果周围存活的细胞有 5 到 7 个时(包含 5 和 7),则细胞保持存活
- 如果周围存活的细胞超过 7 个(不包括 7 个)时,细胞变为死亡状态
- 当细胞为死亡状态时
- 如果周围有 6 个存活细胞时,该细胞变成存活状态
同时我们希望研究无限空间大小下的生命游戏。但是,无限空间难以在计算机中表示,因此,我们采取一种”循环“的策略,来模拟无限空间。具体规则为:若有效信息的块的边长为 M ,则无限空间中任意一点 (x, y, z) 对应有效信息块中的位置为 (x \mod M, y \mod M, z \mod M) 。
输入与输出¶
命令行参数¶
程序应该能接受三个命令行参数,第一个参数为输入文件地址,第二个参数为输出文件地址,第三个参数为需要迭代的轮数 N 。
输入与输出¶
输入输出文件格式相同,为二进制,小端法。 - 第 0 到 7 个字节为一个 8 字节无符号整数类型数据 M ,为有效空间的边长 - 第 8 到 15 个字节为一个 8 字节无符号整数类型数据,为时间戳 T - 对于输入文件,时间戳为 0 - 对于输出文件,时间戳 T=N - 后面 M^3 个字节为 M^3 个 1 字节无符号整数类型数据。位置为 (x,y,z) 的细胞的存活状态储存在其中的第 x \times M^2 + y \times M + z 个字节中。值为 1 代表存活,值为 0 代表死亡。
评测¶
提交单个 cuda 源代码文件,评测系统将会用 nvcc -O3 来编译你的程序。
调试指南¶
在比赛提供的 scow 平台上,选手可以在登录节点上运行 /usr/local/cuda/bin/nvcc 来编译你的程序。
用 srun -p GPU80G -N 1 --gres=gpu:1 来在 GPU 上运行程序。
评分标准¶
选手手动申请的 GPU 分区:GPU 80G 分区,每个是 1/7 张 A100,10G 显存
评测机的 GPU 分区:GPU 40G 分区,每个是 3/7 张 A100 40G,20G 显存
CPU:8 核心 32G
| 编号 | 基础分数 | 满分 | 超时时间 | 满分时间 | M | N |
|---|---|---|---|---|---|---|
| 1 | 1 | 10 | 3s | 660ms | 256 | 2048 |
| 2 | 1 | 20 | 9s | 1.15s | 512 | 1024 |
| 3 | 1 | 70 | 60s | 6.7s | 1024 | 1024 |
可视化¶
handout 中的 visualizer 文件夹是一个可视化程序,你可以看到 3D 生命演化的过程。修改 src/generator/generator.cpp 中的 update_world 函数,就可以迭代生成。主函数在 src/visualizer/visualizer.cpp ,读取输入请使用 World3D 的 load 方法。编译命令是 cmake -B build -DUSE_VISUALIZATION=ON && cmake --build build 。