康威生命游戏C语言实现(串行+intrinsics并行)

本文介绍了康威生命游戏的C语言实现,包括串行和使用SSE2指令集的并行版本。通过SSE2指令集实现SIMD并行,提高计算效率,减少存储器访问次数。实验结果显示在大量迭代时,串行版本的加速比稳定在1.63左右。
摘要由CSDN通过智能技术生成

问题描述

实验:Conway’s Game of Life
康威生命游戏(英语:Conway’s Game of Life),又称康威生命棋,是英国数学家约翰·何顿·康威在1970年发明的细胞自动机。

  1. 规则
    生命游戏中,对于任意细胞,规则如下。每个细胞有两种状态:存活或死亡,每个细胞与以自身为中心的周围八格细胞产生互动。
    1) 当前细胞为存活状态时,当周围低于2个(不包含2个)存活细胞时, 该细胞变成死亡状态。(模拟生命数量稀少)
    2) 当前细胞为存活状态时,当周围有2个或3个存活细胞时, 该细胞保持原样。
    3) 当前细胞为存活状态时,当周围有3个以上的存活细胞时,该细胞变成死亡状态。(模拟生命数量过多)
    4) 当前细胞为死亡状态时,当周围有3个存活细胞时,该细胞变成存活状态。 (模拟繁殖)
    可以把最初的细胞结构定义为种子,当所有在种子中的细胞同时被以上规则处理后, 可以得到第一代细胞图。按规则继续处理当前的细胞图,可以得到下一代的细胞图,周而复始。随题给出了一个细胞图的不断演变过程,见Gospers_glider_gun.gif。
  2. 初始
    给定一个m*n的二维矩阵,若元素为1表示存活,为0表示死亡。初始状态以m行n列的形式保存在一个文件中。例如,随题给出的输入文件input_50*100。
  3. 输出
    会计算迭代N代所需花费的时间打印至屏幕,并输出最终状态至输出文件output_50*100中。
  4. 说明
    本程序行数和列数以及繁殖代数均通过宏定义。分别为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位

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值