3:提问:如果要做多线程/多核优化,应当是怎么样的一种思路?
这个没有固定的方法,也没有绝对的对错,总的原则就是,慢了就想办法优化,从容易优化的地方入手,够用就好。
从我使用过的3个AAA引擎来看,大概有两种思路吧: 3.1:Crystal Dynamics和Sledgehammer Games。一个是古墓丽影的引擎,一个是使命召唤的引擎,这两个引擎的实现是,把比较明显的,容易并行的地方做并行,剩下的在一个主线程内继续单线程运行。 3.2:顽皮狗。顽皮狗的引擎在并行优化上做得是我见过最极致的引擎,使用的是比线程更轻量级的fiber,细节不展开说,主要思路是多核从一开始就并行,基本上不再存在主线程这个概念。当然了,因为计算任务和任务之间仍然存在依赖性因此等待是无法完全避免的,但并行程度一般来说比我接触过的其它引擎更好(还有更高级的多帧在时间上重叠也不展开说)。
这里给出一个顽皮狗引擎并行化的讲座链接,是我们其中一个技术总监讲的,内容很优秀:
Parallelizing the Naughty Dog Engine Using Fibers
1,这确实是非常困难的事。「你行你上」这个回答题主可能觉得不舒服,然而现实就是这样,你试着做做就会发现有多难,这简直是程序员的世纪难题,难到你会发现提出这个问题是可笑的。
2,没有固定思路,必须具体问题具体分析,这也正是多核优化困难的地方。并没有固定的套路去做,有固定套路的地方其实都已经做了,当你真要优化的时候,剩下的必然是那些没有任何通用办法可优化。(顺便说一句,实际上这算不算优化还是存疑的,毕竟多核优化后在计算总量上往往是增加了,额外的代码去协调多任务并行这必然造成计算总量增加。)
3,以我的理解,操作系统不太可能做到这一点。我猜测这实际上指的是让多个核心轮流工作,也就是单一的线程轮流在各个cpu上跑,这样各个cpu均匀发热对散热的控制能更好。实质上单线程还是单线程。要说 cpu 帮你做了小幅度的多核优化还有点可能,操作系统做这事几乎不可能。