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 匹配字符串开头内容与结尾内容(startswith与endswith)
  2. python中is与==的差别
  3. 非因果滤波器 matlab,对于无阶跃响应不会过冲的无因果低通滤波器,最清晰的频率响应是什么?...
  4. 为什么居住的地方离上班的地方很远
  5. 中文自然语言处理(NLP)(三)运用python jieba模块计算知识点当中关键词的词频
  6. 大型开发项目中 git 工作流的最佳实践
  7. Java技术:收集16 条 yyds 的代码规范,值得一读!
  8. .NET的一点历史故事:Novell的崩溃和Xamarin的重生
  9. 吴恩达机器学习logistic回归作业(python实现)
  10. 为什么还有那么多人用SVN?
  11. 现浇板用弹性计算方法_自建房砖混结构现浇楼板配筋的要求和计算方法
  12. C10K 和 C1000K 回顾
  13. 卫龙要上市,辣条就不是垃圾食品了?
  14. 【编程题】【Scratch二级】2020.06 小鸡捉害虫​
  15. 网络分析仪log mag的含义
  16. Android:单位和尺寸(px、pt、dip、dp、sp、layoutparams)
  17. pyspark之dataframe当前行与上一行值求差
  18. PTA 7-106 sdut-C语言实验——模拟计算器
  19. python爬虫请求无反应_Python爬虫开发【第1篇】【HTTP与HTTPS请求与响应】
  20. 调试AVIN后视注册消息BUG改正记录保存

热门文章

  1. sol2 二 教程:快速入门
  2. 博士申请 | 香港科技大学李小萌老师招收深度学习方向全奖博士/博后/RA
  3. 国外优秀CMS(zt)
  4. Mac没有winnt格式_Mac系统如何将其他格式的视频转换为MP4格式
  5. ip广播系统服务器软件,【网络广播服务器软件IP网络广播软件数字广播软件】 - 太平洋安防网...
  6. android 漏洞发布,CVE发布2016年软件漏洞排行榜报告:安卓以523处位居第一
  7. 2023最新版会声会影有哪些新功能介绍?
  8. Redis的主从复制(Master/Stave)
  9. 小程序管理还能这样做,让小程序管理更高效
  10. 1.递归实践:小白上楼梯