我的笔记本电脑有4个逻辑处理器(两个物理处理器);逻辑CPU 1和2映射到Core 1,逻辑CPU 3和4映射到Core 2(用GetLogicalProcessorInformation()
验证)。
我用两个线程在我的计算机上运行了一个多线程矩阵乘法程序。第一次使用SetProcessAffinityMask(hProcess, 0x5)
(即逻辑处理器1和3),第二次使用SetProcessAffinityMask(hProcess, 0xA)
(逻辑处理器2和4)。
结果第一个版本的速度大约是第二个版本的两倍,好像我从来没有多线程第二个版本。
有人猜到为什么会这样吗?
测量:
接通电源(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
(->很有趣,为什么用电池时是半速,而用交流电时是正常速度?!这一个在1.5-2.5 gflop/s之间变化很大,与其他的不同。)
亲和力掩码:0xC(1100B),5 gflop/s
这是否意味着第四个逻辑CPU没有做任何事情(!)?(设置第四个CPU的掩码的所有操作都很慢。)
更新:
我刚刚在高性能的电池配置文件上运行了同样的程序。结果是不一致的:这一次,我得到了2倍的速度为面具5,6,和10,但没有加速面具12。我会尝试在交流电源上再次运行测试,但最终看来,这一结果是电源管理、涡轮增压、调度不一致等因素综合作用的结果,而且比我之前想象的更难测量。:(
最佳答案
很高兴知道这是什么物理CPU,但我假设从你对逻辑处理器的措辞,有1个物理插槽,2个CPU核心,和超线程是启用给你4个逻辑处理器。
简而言之,对于“处理器”这个复杂的定义,不是所有的处理器都是平等的。超线程逻辑核心共享执行资源,如果对这些资源有争用,它们就不会像单独的物理核心那样快。对于超线程和多核处理器(ALU、执行资源、不同级别的缓存等),这种共享可以在不同级别上进行,但从广义上讲,同一套接字中的物理内核不会受到其他内核正在做的事情的太大影响,而由超线程实现的逻辑核心将受到其hypertwin所做工作的巨大影响。
不同CPU之间的另一个区别是:正如Ben所说,你的操作系统可能会在一个CPU上处理大多数硬件中断,这意味着CPU在其他方面看起来会更慢,但是如果中断负载足以影响接近这个值的任何性能,我会感到惊讶。
你得到的结果——在A和B处理器上(故意不清楚是哪两个处理器),你得到的性能是A单独的两倍,但在A和C处理器上,你得到的性能和A单独的差不多——听起来像是超线程是不同的,A和BC是同一个物理核心中的超温,B是另一个物理核心中的超温。您说过getLogicalProcessorInformation()声明了其他情况,但对于依赖于它的BIOS表有错误的情况并非闻所未闻。
我会运行task manager,在运行测试之前关注每个cpu上的负载,以了解还有多少其他的工作要进行,以及windows将其安排在哪里,然后针对cpu关联的不同组合再次运行测试几次,看看您是否可以确认或否认这一理论。