Intel正在ISN网站上举办一个多线程编程大赛,值得关注。Intel过去几年举办过好几次线程技术大赛,包括与topcoder合作的一些竞赛,质量都不错。题目难度适中,而且具有启发性,对多核编程感兴趣的C/C++程序员应该关注一下。其实参与这样的活动,置身于竞赛气氛当中,无论是否获奖,都可以在短时间内大幅度地提高对多线程编程的理解。这次比赛比较有特色,为期长达几个月之久,而且每个月都有一轮竞赛,每月评选一轮优胜奖,奖品也很诱人,是一颗4核的酷睿2CPU ;-)

本月(2008年1月)的题目是一个经典问题“生命游戏”。这是英国数学家John Conway发明的一个有趣的游戏。不过这个游戏之所以名声大噪,还得归功于著名科普作家马丁•伽德纳。他在1970年10月号的《科学美国人》杂志“数学游戏”专栏介绍了生命游戏,不但让大众迷上这个游戏,也令多专业数学家产生了研究的兴趣,甚至产生了一个新的数学研究领域cellular automata(细胞自动机?),听说这个领域还对模拟类游戏产生了影响,不知是否确有其事。

大致来说,生命游戏是这样玩的。在一个由正方形小格子组成的二维网格(就像国际象棋棋盘那样)里,生活着一群细胞。每一个细胞占据一个小格子。它的四邻左右(最多)有8个格子,如果那些格子里也生活着细胞,那么这些细胞就成为“邻居”。

细胞对生存环境要求苛刻,太孤独的话会死。但是食物有限,所以太拥挤也会死。细胞还需要繁衍生息,如果邻居数量合适,就可以在空格子里分裂出新的细胞。数学家们研究的话题是,怎样制定规则才能让细胞群的繁衍发展呈现某种特定的模式,比如说,能够稳定持续地发展下去,或者逐渐消亡,或者恒定不变,或者,最有趣的是,在几个状态之内反复循环。要想“生生不息”,这些条件即不能太严苛,也不能太宽松。总之,Conway对于生命游戏制定的规则如下:

1.    如果一个细胞只有0或1个邻居,它将因为孤独而死;
2.    如果一个细胞有4到8个邻居,它将因为拥挤而死;
3.    如果一个细胞恰有2或者3个邻居,它将继续生存下去;
4.    如果一个空格子恰有3个邻居,将“生”出一个新细胞;
5.    其他的空格子继续维持原状。

这个问题出现在程序员面前的时候,大多数是要求开发一个程序来对这个游戏进行模拟。我以前学习数据结构和算法的时候曾经接触过,但是没有深入思考。其实这个问题很有趣,算法上可以有些变化,但主要是数据结构的设计,可以有几种不同的考虑。比如可以从网格角度出发,设计一个(可能是稀疏的)矩阵,用0或1表示细胞的生死,每过一代就对矩阵进行一次全局扫描,决定细胞的生死。也可以从细胞出发,把每个细胞的二维坐标位置记下,然后一个细胞一个细胞地考察,没考察一个细胞,就把它可能影响到的其他细胞或者空格纳入视线,等到全部细胞考察完毕,也就可以一次性决定下一代的格局。后面这种算法减少了需要考虑的情况数量,当网格很大而细胞比较稀疏时就节省了时间。

不过这次Intel的竞赛并不想让参赛者在算法上动脑筋,而是已经把串行程序实现了,要求参赛者在其基础上改成并行多线程程序。可以从竞赛站点上分别下载Linux和Windows版的串行程序实现。其中的算法基本上是上述第二种,即从细胞出发的算法。程序当中自制了一个超级简单的链表数据结构,然后用四个链表newlive, newdie, maylive, maydie,分别表示新生的,刚死的,可能出生的和可能死掉的细胞。然后用TraverseList函数遍历链表,并对链表中的每一个元素施加相应的操作。最后把结果一口气写在一个5002x5002的网格中。实际上这个网格的有效尺度是5000x5000,多出来的那两行和两列,是为了方便边界条件的处理。整个算法还是很直白的,建议有兴趣的人直接下载程序来阅读理解。

我大致思考了一下,实际上这个题目还是属于一个数据并行的算法,关键在与把链表的访问函数并行化,包括ClearList,TraverseList,CopyList,如果能够充分并行化,则可以利用多核CPU的多个硬件线程加速程序的执行。如果是为了这个目标,简单的单链表就似乎不是最好的数据结构,而类似STL中std::vector那样的动态数组就比较适合,因为可以很有效的分段。我的大致想法如下:

用std::vector取代List作为基本数据结构,设定一个合适的grain size,也就是说一个线程处理的细胞数量。一般来说,这个数量的大小大致以需要消耗10,000条机器指令为好,我估计在这个例子中,100是一个合理的数值。然后根据现有细胞数量,确定线程数N。主线程创建N个线程后调用join阻塞自己,等待那N个线程分别在List的不同片段上执行相同的操作。当所有的线程执行完毕之后,就可以得到所需的结果。这里还应该用线程池来避免频繁地创建线程。至于算法,直接用程序中提供的即可。这个题目主要还是考察线程操作。

这里的难点还是在那些底层的线程API。我不太熟悉pthread,对Windows线程还是比较熟悉的。尽管如此,让我去写一个小的线程池,然后再把每一个片段任务分配给线程来执行,再处理同步什么的,还是有点麻烦。直接使用OpenMP或者Intel Threading Building Blocks就会方便很多。我倾向于使用后者,不过还需要学习。

这是我的是一些思考,有兴趣的朋友不妨试试做一下这个题目。

Intel线程挑战赛的网址是:
     http://softwarecontests-zho.intel.com/threadingchallenge/

“生命游戏”的多线程算法思考[转]相关推荐

  1. “生命游戏”的多线程算法思考

    Intel正在ISN网站上举办一个多线程编程大赛,值得关注.Intel过去几年举办过好几次线程技术大赛,包括与topcoder合作的一些竞赛,质量都不错.题目难度适中,而且具有启发性,对多核编程感兴趣 ...

  2. 算法思考--------生命游戏

    一. 问题说明          生命游戏其实是一个零玩家游戏,英文名叫Game of Life,也称生命棋.它包括一个二维矩形世界,这个世界中的每个方格居住着一个活着的或死了的细胞.一个细胞在下一个 ...

  3. 生命游戏的计算机程序,生命游戏,算法与实现

    生命游戏,算法与实现 yanlb2000 0 一些关于"生命游戏"的基本概念 "生命游戏"在计算机界不是什么新鲜的事物,也不仅仅属于计算机科学.按我的理解,它大 ...

  4. 伍六七带你学算法 进阶篇-生命游戏

    有趣的算法题–生命游戏 难度-中等 根据 百度百科 ,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机. 想要体验生命游戏的小伙伴可以到这里-->生命游戏 进入 ...

  5. 【老生谈算法】matlab实现生命游戏源码——生命游戏

    MATLAB实现生命游戏源码 1.文档下载: 本算法已经整理成文档如下,有需要的朋友可以点击进行下载 序号 文档(点击下载) 本项目文档 [老生谈算法]MATLAB实现生命游戏源码.docx 2.算法 ...

  6. 「 生活太重要了,不能太过严肃 」:生命游戏之父、最神奇的数学家John Conway...

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 来自:机器之心 在 82 年的人生中,John Conway 始终保持着狡黠淘气的幽默 ...

  7. 生命游戏代码_生命游戏 the Game of Life

    引言 群居性昆虫是一个生命,鱼群.鸟群是一个生命,社会.城市是一个有机体,人类的语言是活的,人类的集体行为也是活的.这些复杂系统是如何设计出来的?世界上最著名的游戏之一,Game of Life生命游 ...

  8. 生命游戏,25号宇宙与奋斗者

    1970年10月,英国科学家约翰·康威发明了一款生命游戏,游戏的意义在于模拟细胞的生存繁衍.这个游戏发表在<科学美国人>杂志上.感兴趣的同学可以登录网站https://playgameof ...

  9. 康威生命游戏是如何搭建计算机的?

    2020年4月,数学家约翰·康威(John H. Conway)因新冠肺炎去世.大家回顾康威教授平生贡献时,不可避免要提到伟大.深刻的"康威生命游戏"(Conway's Game ...

最新文章

  1. Python中一些高效的数据操作
  2. 科大星云诗社动态20210518
  3. SQL Server Management Studio 过期无法使用解决办法
  4. 图像分类_04神经网络最优化过程:反向传播+代码实现
  5. const 修饰函数参数,返回值,函数体,保护数据
  6. linux下内存的统计和内存泄露问题的定位-转
  7. python 程序化交易名单_2020 Python程序化交易高级实战班 - 优量在线 - 学量化投资,到优量在线 - Powered By EduSoho...
  8. linux解决蓝牙和网卡,完全用Deepin Linux娱乐、工作、学习(3)-- 无线网卡及蓝牙设备驱动篇...
  9. gd32f450 linux,GD32F450开发板初体验
  10. LS-DYNA基础理论
  11. 教育技术资源大全(05-11-28)
  12. 听说你还不会制作“GIF动图”,手把手包教会,这不就来了吗
  13. word中公式和文字不在一行的设置方法
  14. 计算机权限删除文件win10,win10系统使用管理员权限无法删除部分文件的详细步骤...
  15. 封装composer包包
  16. android地图画线,绘制折线-在地图上绘制-开发指南-Android 轻量版地图SDK | 高德地图API...
  17. LwIP 协议栈移植教程
  18. Python的简单数据类型案例
  19. Unity Excel转Json小工具excel2json
  20. linux vsftpd上传文件权限,如何用vsftpd实现用户不同权限:只能下载,可上传,管理权限等...

热门文章

  1. 安装并配置Apache
  2. Ralink WIFI driver发送速率选择算法分析
  3. lamp配置域名跳转不能实现
  4. 匿名联合(Anonymous unions)
  5. 最新微信文章编辑器源码PHP+MYSQL架构后台可添加或删除模版
  6. OpenGL ES 名词解释(二)
  7. Jenkins + Gitee + Maven 自动化部署 Spring Boot
  8. 中文论文翻译成英文投稿国外期刊的小tips
  9. c语言求泡点温度,化工0801-0803班C语言课程设计任务书.doc
  10. python招聘工资_爱名:利用Python分析了3万个招聘结果,SEO真实工资大揭秘!