不是所有的处理器都是一样的吗

我的笔记本电脑有4个逻辑处理器(两个物理); 逻辑CPU 1和2映射到内核1,而逻辑CPU 3和4映射到内核2(通过GetLogicalProcessorInformation()validation)。

我用两个线程在我的电脑上运行了一个multithreadingmatrix乘法程序。 我第一次使用SetProcessAffinityMask(hProcess, 0x5) (这意味着逻辑处理器1和3),而第二次使用SetProcessAffinityMask(hProcess, 0xA) (逻辑处理器2和4)。

事实certificate,第一个版本大约是第二个版本的两倍,好像我从来没有multithreading的第二个版本。

有没有人有任何猜测为什么这可能会发生?


测量:

  • 插入(完整的CPU):

    • 亲和力掩码:0x3(0011b),9 gflop / s
    • 亲和力掩码:0x5(0101b),17 gflop / s
    • 亲和力掩码:0x6(0110b),17 gflop / s
    • 亲和力掩码:0x9(1001b),9 gflop / s
    • 亲和力掩码:0xA(1010b),9 gflop / s
    • 亲和力掩码:0xC(1100b),9 gflop / s
  • 在电池(时钟):

    • 亲和力掩码:0x3(0011b),5 gflop / s
    • 亲和力掩码:0x5(0101b),10 gflop / s
    • 亲和力掩码:0x6(0110b),10 gflop / s
    • 亲和力掩码:0x9(1001b),5 gflop / s
    • 亲和力掩码:0xA(1010b),2 gflop / s( – >非常有趣,为什么电池的速度是一半的速度,而交stream的速度是正常的,这一点在1.5-2.5 gflop / s之间变化很大,不像其他的)。
    • 亲和力掩码:0xC(1100b),5 gflop / s

这是否意味着第四个逻辑CPU没有做任何事情(!)? (所有第四个CPU设置的掩码都很慢。)


更新:

我只是在高性能电池上运行相同的东西。 结果是不一致的:这一次,我为面具5,6和10加快了2次加速,但面罩12没有加速。我将尝试在AC电源上再次运行testing,但最终看起来像这样结果是电源pipe理,Turbo Boost,调度不一致等等的组合,比我以前想象的更难以衡量。 🙁

最好知道这是什么物理CPU,但是从逻辑处理器的角度来看,假设有1个物理插槽,2个CPU核心,超线程可以为您提供4个逻辑处理器。

简单的回答是,对于“处理器”这个复杂的定义,不,并不是所有的处理器都是相同的。 超线程逻辑内核共享执行资源,如果存在争用这些资源的情况,它们将不会像独立的物理内核那样快速。 对于超线程和多核处理器(ALU,执行资源,不同级别的缓存等),这种共享可以在不同的级别上进行,但从广义上讲,同一个套接字中的物理内核不会受到另一个内核s)正在进行,超线程实现的逻辑核心将受到hyperwin正在做什么的巨大影响。

不同的CPU之间的另一个区别:正如本人所说,你的操作系统可能会在一个CPU上处理大多数硬件中断,这意味着CPU看起来比较慢,但是如果中断负载足以影响到任何附近的性能,我会感到惊讶这么多。

你得到的结果 – 处理器A和处理器B(对这两个处理器故意含糊不清)你的性能是A的两倍,但是在处理器A和C上,你的性能与A单独大致相同 – 像超线程是不同的,其中A和C是在同一个物理核心中的高压,B在另一个物理核心。 你说GetLogicalProcessorInformation()声明,否则,这是不是闻所依赖的BIOS表错误。

我将运行任务管理器,在运行测试之前关注每个CPU上的负载,以了解还有多少事情正在进行以及Windows在何处安排测试,然后再次运行测试几次,以获取CPU的不同组合亲和力,看看你能否证实或否定这个理论。

SetProcessAffinityMask()不保证每个核心都有一个线程; 只有你拥有的线程才能在你允许的内核上运行。

也许操作系统的调度方式不同。

此外,我很惊讶1和2在核心1上。通常,逻辑处理器号码交错在物理核心上,以提供固有的负载平衡。 我期望1和3在核心1,2上,核心2上。

不,不是所有核心都是平等的。 只有一个是启动核心。 此外,在许多情况下,所有IRQ(或至少来自大多数设备的IRQ)都是针对单个核心的。


对于你观察到的行为更重要的是,并不是所有的核心都是平等的。 在NUMA内存架构(自从Intel超线程和AMD Opteron以来,在x86中已经相对主流),有一组理想的处理器可以高效地访问某个特定的内存区域,所有其他处理器将会为访问这个范围。

超线程不是主要的系统内存不连接,而是L1和L2缓存。 如果您的进程在与同一物理内核关联的两个虚拟处理器之间迁移,则缓存保持有效。 但是,如果它迁移到其他物理核心,缓存的数据必须被复制,并将所有权转移到另一个缓存。 对于一些工作负载,这可能会有很大的不同。

你检查了SetProcessAffinityMask的返回码是否有错误? 如果调用失败,可能会卡在一个逻辑处理器上。 根据文档 ,您只能使用GetProcessAffinityMask的结果中设置的位。

你说你已经尝试了0x90x9 。 我很好奇,看到与0x3的结果。