高线程消耗对ARM(4核A72)与x86(2核i5)的影响



我有一个实时linux桌面应用程序(用C编写),我们正在将其移植到ARM(4核Cortex v8-A72 CPU)。在体系结构上,它具有高优先级显式pthread(其中6个)和两个GCD(libdispatch)工作队列(一个并发,另一个串行)的组合。

我的担忧有两个方面:

  • 我听说ARM没有x86那样的超线程,因此我的4核已经在进行上下文切换,以跟上我的6个pthread(和后台进程)。我期望从中得到什么样的表现惩罚?
    • 我听说这些ARM上下文开关的效率应该低于x86。这是真的吗
    • 几个pthread是相当罕见的ish事件的高优先级处理程序,这对前景有很大改变吗?(即他们坐在select声明上)
  • 我更担心的是GCD在这个应用程序中的影响。我对GCD内部工作的理解是,它是一个动态缩放的线程池,与调度程序交互,并将尝试添加更多线程以适应负载。在我看来,在我的场景中,这几乎完全会对性能产生负面影响。(例如,在核心被完全消耗的系统中)正确吗

我不是任何与x86体系结构相关的专家(所以希望有更有经验的人能参与进来),但以下是对您问题的一些高级回答。

我听说ARM没有x86可以〔…〕的超线程方式

正确,超线程是英特尔芯片设计的专有功能。据我所知,没有类似的ARM硅技术。

[…],因此我的4核已经在进行上下文切换,以跟上我的6个pthread(和后台进程)。我期望从中得到什么样的表现惩罚?[…]

这不一定是的情况,尽管它很可能在许多情况下发生。它实际上更多地取决于每线程计算的性质。。。你只是做了很多繁重的计算,还是在IO上做了很多阻塞/等待?无论哪种方式,这种降级都会发生在两种体系结构上,而且它更像是一个通用的线程调度问题。在超线程的英特尔世界中;物理核心";被OS视为两个";逻辑核心";它们共享相同的资源,但是具有它们自己的流水线和寄存器集。维基百科的文章指出:

每个逻辑处理器都可以独立于共享同一物理核心的其他逻辑处理器,单独暂停、中断或指示执行指定线程。[7]

与使用两个独立物理处理器的传统双处理器配置不同,超线程核心中的逻辑处理器共享执行资源。这些资源包括执行引擎、缓存和系统总线接口资源共享允许两个逻辑处理器更高效地相互协作,并允许逻辑处理器从停滞的逻辑核心借用资源(假设两个逻辑核心都与同一物理核心关联)。处理器在等待发送的数据时会暂停,以便完成对当前线程的处理。使用超线程或多核处理器时所看到的好处程度取决于软件的需求,以及它和操作系统的编写情况如何,以有效地管理处理器。[7]

因此,如果您的一些线程不断阻塞I/O,那么这可能是您在4物理核心系统(对于ARM和intel x86)上的6线程应用程序中看到更多改进的地方,因为理论上这是超线程的亮点。。。。在IO上或在另一个线程的结果上阻塞的线程可以"被阻塞";睡眠;同时仍然允许在同一核心上运行的其他线程在没有线程切换的全部开销的情况下进行工作(如果我错了,请专家们插话告诉我)。

但是4核ARM与2核x86……假设其他一切都相等(事实显然并非如此,实际上时钟速度、缓存层次结构等都会产生巨大影响),那么我认为这实际上取决于线程的性质。我可以想象,如果你只做大量的纯cpu绑定的计算(即线程永远不需要等待cpu外部的任何东西),性能可能会下降。但是,如果在每个线程中执行大量阻塞I/O,则可能会显示出显著的加速,每个逻辑核心可能会执行3或4个线程。

另一件需要记住的事情是缓存。在进行大量cpu绑定计算时,线程切换可能会破坏缓存,导致最初的内存访问速度慢得多。这将在两种体系结构中发生。不过,I/O内存的情况并非如此。但是,如果你没有做很多阻塞的事情,那么由于上述原因,线程的额外开销只会使它变得更慢。

我听说这些ARM上下文开关的效率应该低于x86。这是真的吗?

硬件上下文开关是硬件上下文开关,您可以将所有寄存器推送到堆栈,并翻转一些位以更改执行状态。所以不,我不相信两者都是";"更快";在这方面然而对于单个物理核心,像超线程这样的技术会产生";上下文切换";在操作系统的意义上(我想你的意思是在线程之间切换)要快得多,因为两个程序的指令已经在同一个内核上并行执行了。

我对GCD一无所知,所以不能对此发表评论。

最后,我想说,最好的办法是在两种体系结构上对应用程序进行基准测试。查看您的瓶颈所在。是内存访问吗?因此,保持缓存热是一个优先事项。我想,如果你能摆动的话,每个核心1个线程对任何场景来说都是最优的

关于这件事,一些值得阅读的好东西:

  1. https://blog.tsunanet.net/2010/11/how-long-does-it-take-to-make-context.html
  2. https://lwn.net/Articles/250967/
  3. 每个核心的最佳线程数
  4. 线程上下文切换与进程上下文切换

最新更新