有人可以向我推荐一些文档来说明多CPU,多核和超线程之间的区别吗?我总是对这些差异以及不同场景中每个架构的优缺点感到困惑.
编辑:这是我在网上学习并从别人的评论中学习后的当前理解; 有人可以评论评论吗?
乔治,提前谢谢
我正在使用多个线程在C中实现图像过滤操作,并使其尽可能优化.我有一个问题:如果一个内存被thread-0访问,并且如果同一个内存被thread-1访问,它是否会从缓存中获取它?这个问题源于这两个线程可能运行到CPU的两个不同核心的可能性.所以另一种方法是:所有内核是否共享相同的公共缓存?
假设我有如下的内存布局
int输出[100];
假设有2个CPU核心,因此我产生两个线程同时工作.一种方案可以是将内存分成两个块,0-49和50-99,并让每个线程在每个块上工作.另一种方法是让线程0在偶数索引上工作,比如0 2 4等等.而另一个线程工作在奇数索引上,比如1 3 5 ......这个后来的技术更容易实现(特别是对于3D)数据)但我不确定我是否可以通过这种方式有效地使用缓存.
我原本认为缓存一致性协议(如MESI)可以提供伪原子性,但仅限于单个内存加载/存储指令.如果我正在执行获取,修改,写入指令组合,单独的MESI将无法在第一条指令到最后一条指令中强制执行原子性.
但是,英特尔参考手册第3a卷第8节说:
8.1.4 LOCK操作对内部处理器高速缓存的影响
对于P6和更新的处理器系列,如果在LOCK操作期间被锁定的存储器区域被高速缓存在执行LOCK操作作为回写存储器并且完全包含在高速缓存行中的处理器中,则处理器可能不会断言总线上的LOCK#信号.相反,它将在内部修改内存位置并允许其缓存一致性机制,以确保以原子方式执行操作.此操作称为"缓存锁定".缓存一致性机制自动防止缓存相同内存区域的两个或多个处理器同时修改该区域中的数据.
这似乎与我的理解相矛盾,暗示LOCK指令不需要使用,因为可以使用缓存一致性?
有很多文章讨论多核神话。为了真正受益于多个内核,需要编写并行算法。他们中许多人提到阿姆达尔定律。
为了简单起见,假设我们有一台带有4核商品CPU的台式计算机。并假设目标是提高我们的应用程序性能以及整体系统性能。
我想知道如何使用CPU内核来执行任务。
如果是后者,那为什么还要讨论神话呢?即使所有进程都是单线程的,多任务OS也不总是受益于多核CPU吗?来自同一进程的线程是否更有可能在多个内核上同时调度?
是否有一个“主动过程”概念?即,最受调度程序关注的过程。如果是这样,那么此过程通常会引起多少关注?