线程的经验法则是,您希望计算机上可用的每个“执行单元”至少有一个“活动”(能够在给定CPU时间后立即执行其命令)的工作线程。“执行单元”是一个逻辑指令处理器,因此四芯片,四核Xeon超线程服务器将具有32个EU(4个芯片,每个芯片4个内核,每个超线程)。您的平均Core i7值为8。
如果每个EU始终处于运行状态,则每个EU最多可以使用一个线程。几乎从来没有这种情况,因为线程需要访问必须等待的非缓存内存,硬盘,网络端口等,并且不需要活跃的CPU来执行。因此,您可以通过排队等待并等待更多线程来进一步提高整体效率。这确实是有代价的。当一个CPU切换一个线程时,它必须缓存该线程的寄存器,执行指针和其他状态信息,这些信息通常保存在EU的最内部工作中,并且必须非常快速地访问,以允许该CPU芯片中的其他EU来取走它。它还需要操作系统中的线程来决定应切换到哪个线程。最后,当欧盟更换线程时,它失去了大多数处理器体系结构使用的流水线性能提升;它必须在切换线程之前冲洗管道。但是,由于平均而言,与仅等待硬盘驱动器甚至RAM返回信息相比,所有这些平均花费的时间要少得多,所以值得付出成本。
但是,总的来说,一旦您获得的“活动”线程数量是欧盟的两倍,操作系统就会开始花费更多的欧盟时间安排线程,并且欧盟之间进行切换的时间会比实际花费在运行活动线程上的时间更多程序。这是规模不经济的重点;如果此时要添加一个额外的线程,则运行多线程算法实际上将花费更长的时间。
因此,总的来说,您要在程序中维护的线程数至少要与计算机上具有EU的线程数相同,但您要避免使没有等待或休眠的线程数增加一倍以上。