问题描述
实验:Conway’s Game of Life
康威生命游戏(英语:Conway’s Game of Life),又称康威生命棋,是英国数学家约翰·何顿·康威在1970年发明的细胞自动机。
- 规则
生命游戏中,对于任意细胞,规则如下。每个细胞有两种状态:存活或死亡,每个细胞与以自身为中心的周围八格细胞产生互动。
1) 当前细胞为存活状态时,当周围低于2个(不包含2个)存活细胞时, 该细胞变成死亡状态。(模拟生命数量稀少)
2) 当前细胞为存活状态时,当周围有2个或3个存活细胞时, 该细胞保持原样。
3) 当前细胞为存活状态时,当周围有3个以上的存活细胞时,该细胞变成死亡状态。(模拟生命数量过多)
4) 当前细胞为死亡状态时,当周围有3个存活细胞时,该细胞变成存活状态。 (模拟繁殖)
可以把最初的细胞结构定义为种子,当所有在种子中的细胞同时被以上规则处理后, 可以得到第一代细胞图。按规则继续处理当前的细胞图,可以得到下一代的细胞图,周而复始。随题给出了一个细胞图的不断演变过程,见Gospers_glider_gun.gif。 - 初始
给定一个m*n的二维矩阵,若元素为1表示存活,为0表示死亡。初始状态以m行n列的形式保存在一个文件中。例如,随题给出的输入文件input_50*100。 - 输出
会计算迭代N代所需花费的时间打印至屏幕,并输出最终状态至输出文件output_50*100中。 - 说明
本程序行数和列数以及繁殖代数均通过宏定义。分别为Width,length,gap。
SSE2指令集(实现SIMD并行)说明
详细的SSE2指令集参见SSE2 Intrinsics各函数介绍 及简单例子
本文中只对本实验需要用到的函数做出说明
SSE2的数据类型:
SSE2的数据总宽度为128位,可以表示成:
四个单精度浮点数
两个双精度浮点数
16个字节整数
8个16位整数
4个32位整数
2个64位整数
意思是SSE2指令一次性可以处理128位的数据,至于该128位的数据内部到底是四个单精度浮点数还是8个16位整数等,编译器不加以限制。这里需要程序员在使用的时候用不同的指令来区分。
内嵌原语的数据类型
p: 紧密,指令对寄存器中的每个元素进行运算
ep: 扩充紧密
s: 标量,只将寄存器中的第一个元素参与运算
其他说明数据类型的关键字有:
s —— 单精度浮点数
d —— 双精度浮点数
i128 ——带符号128位整型
i64 —— 带符号64位整型
u64 ——无符号64位整型
i32 ——带符号32位整型
u32—— 无符号32位