3D生命游戏

分数：200

提交次数限制：1/20

题面

提交

附件

简介

康威生命游戏（Conway's Game of Life），是英国数学家约翰・何顿・康威在1970年发明的细胞自动机。

在初始版本的生命游戏中，世界是一个二维的方格矩阵，其中，每个方格中居住着存活或者死亡的细胞。一个细胞在下一时刻的生死取决于相邻的八个方块中居住的存活或者死亡的细胞的数量，具体规则如下：

当细胞为存活状态时

如果周围存活的细胞低于2个（不包含2个）时，细胞变为死亡状态

如果周围存活的细胞有2个或者3个，则细胞保持存活

如果周围存活的细胞超过3个（不包括3个）时，细胞变为死亡状态

当细胞为死亡状态时

如果周围有3个存活细胞时，该细胞变成存活状态

重复以上过程，康威生命游戏便可周而复始地进行。由于规则简单，又能产生一些有趣的现象，生命游戏的生命力经久不衰。你可以在这个网站玩到原版的生命游戏。默认的场景就是一个不断向外运输块的“太空船”，就好像人类发射火箭，探索太空一样。观察这些现象的时候，仿佛我们就是造物主，看着芸芸众生忙碌奔波。

3D 版本康威生命游戏

在本题中，你将研究拓展到三维版本的康威生命游戏。在三维版本中，每个细胞有26个邻居，状态转移规则如下：

当细胞为存活状态时

如果周围存活的细胞低于5个（不包含5个）时，细胞变为死亡状态

如果周围存活的细胞有5到7个时（包含5和7），则细胞保持存活

如果周围存活的细胞超过7个（不包括7个）时，细胞变为死亡状态

当细胞为死亡状态时

如果周围有6个存活细胞时，该细胞变成存活状态

同时我们希望研究无限空间大小下的生命游戏。但是，无限空间难以在计算机中表示，因此，我们采取一种”循环“的策略，来模拟无限空间。具体规则为：若有效信息的块的边长为MMM，则无限空间中任意一点(x,y,z)(x, y, z)(x,y,z)对应有效信息块中的位置为(xmod  M,ymod  M,zmod  M)(x \mod M, y \mod M, z \mod M)(xmodM,ymodM,zmodM)。

输入与输出

命令行参数

程序应该能接受三个命令行参数，第一个参数为输入文件地址，第二个参数为输出文件地址，第三个参数为需要迭代的轮数NNN。

输入与输出

输入输出文件格式相同，为二进制，小端法。

第000到777个字节为一个8字节无符号整数类型数据MMM，为有效空间的边长

第888到151515个字节为一个8字节无符号整数类型数据，为时间戳TTT

对于输入文件，时间戳为0

对于输出文件，时间戳T=NT=NT=N

后面为M3M^3M3个字节为M3M^3M3个1字节无符号整数类型数据。位置为(x,y,z)(x,y,z)(x,y,z)的细胞的存活状态储存在其中的第x×M2+y×M+zx \times M^2 + y \times M + zx×M2+y×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。