|
LZ所讨论的东西跟INTEL或AMD无关,是否能用多线程并行计算,取决程序的架构,计算前后的数据依赖性,算法,等等。当我们写某个程序的时候,默认的时候都是单线程的。
每当我们手动创建多一个线程时就要考虑数据同步,线程的阻塞互斥,打个简单的比方:你自己从篮子中拿苹果,是可控的,因为你自己知道总数,并知道自己拿了多少,这样进行下一步运算时,可以期待拿到的数据是正确的,但是一旦多个人加入,那么他从篮子中拿几个苹果,你是不知道的,因为线程间彼此是分离的。
所以为了保证线程的同步,我们根据算法就要手动加入某些规则,某些特殊的运算,每加入一个线程,编程的复杂度就会成倍上升,出错的几率自然上升,DEBUG所花的成本就会上升。而且每当我们写好一个多线程的应用,那具体能跑到什么程度,还取决于编译器,操作系统,并不是说我们在写程序的时候创建了3个线程,那程序在运行时就一定是呈现CPU运行时3个内核100%的占用。假如操作系统有平衡负载的能力,那么就会根据时间片的轮转平衡所有负载,那时我们的3线程程序就很有可能呈现6核心占用50%的样子。
所以您看到的superpi实际上是一个单线程的程序,当它达到100%占用的时候,操作系统将他平衡负载,呈现出2个核心50%的。至于为什么不能2个核心都100%,很简单,一、平衡负载。二、它是单线程程序。假设superpi是个2线程程序,那么它运行时,很可能呈现4核心50%占用,假设处理器只有2个核心,那么此时很可能呈现出2核心100%占用。
多线程计算PI值,请参考wPrime。 |
|