- 论坛徽章:
- 4
|
还有一个疑问,如果单CPU不带cache的话,每次都要访存,那么RAM的速度比CPU慢很多,多CPU不是也没有用吗,如果每个CPU都带cache,那么2个cache怎么同步?
实际注意的,如果是应用程序,单任务,没什么注意的,多任务就要有一些保护,大多数可能已经加了信号量,不过仍然可能存在一些共享变量操作在并发的时候出问题的概率小,而并行的时候出现概率大。
取指译码访存执行写回这方面双核CPU根本不会相互工作,各自干各自的。如果不是深度优化,用信号量保护临界资源,完事OK。
一段代码不会再双核里面分配执行,双核只是线程级并行,你开多线程才能用到多核的优势,你就一个线程,吭哧吭哧在那搞,跟单核基本一样,甚至性能更差。
CPU都带cache,多核之间cache需要通过cache coherency机制保证各个核之间数据的coherency。不过乱序的处理器,让然需要手工处理consistency。
同事A说:该CPU双核ARM A9共用一个cache,在线程调度时做CPU切换,并没有特殊指令做切换,在什么命令附带下切换也不知道。代码也不能绑定到一个CPU上指令。用spin_lock可解决多CPU问题,否则出现中断就会让代码中(读寄存器->改值->写寄存器)这类顺序打断并写错值。或关中断。
--一般来说L1 cache都是私有的,LLC都是共享的。线程调度跟单核没什么区别。代码与CPU的捆绑没关系,应该说是线程可以捆绑CPU,这是操作系统可以提供的。spin和信号量都可以同步,信号量是阻塞等,spin是忙等。多核里面关中断也不一定是安全的,大多数只能关本核中断。顺序打乱是需要consistency保证的,单核也有这个问题。
同事B说:可以绑定,还说负载均衡是CPU自己做的。
--可以绑定线程,但负载均衡不懂是什么意思。
如果一个CPU执行一条线程,那另一个CPU不是白费了,越久切换不是越浪费吗。这和单核有什么差别?如果不考虑流水线,一时也只有一个CPU在执行
说icache和CPU速度差不多,那么每次取指都要访问icache,即使CPU0,1执行指令是1,3,5,2,4,6这样交叉,都受cache速度影响,另一个CPU也是浪费了。
--多核是线程级并行技术,并非指令级并行技术。 |
|