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

Parallel processing 重线程消耗对ARM(4核A72)与x86(2核i5)的影响,parallel-processing,operating-system,arm,multiprocessing,grand-central-dispatch,Parallel Processing,Operating System,Arm,Multiprocessing,Grand Central Dispatch,我有一个实时linux桌面应用程序(用C编写),我们正在将其移植到ARM(4核CortexV8-A72 CPU)。在体系结构上,它结合了高优先级显式pthread(其中6个)和两个GCD(libdispatch)工作队列(一个并发,另一个串行) 我关注两个方面: 我听说ARM不能像x86那样进行超线程处理,因此我的4核已经开始进行上下文切换,以跟上我的6个pthread(和后台进程)。我应该从中得到什么样的性能惩罚? 我听说这些ARM上下文切换的效率应该低于x86。这是真的吗 有几个pthr

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

我关注两个方面:

  • 我听说ARM不能像x86那样进行超线程处理,因此我的4核已经开始进行上下文切换,以跟上我的6个pthread(和后台进程)。我应该从中得到什么样的性能惩罚?
    • 我听说这些ARM上下文切换的效率应该低于x86。这是真的吗
    • 有几个pthread是相当罕见的ish事件的高优先级处理程序,这会对前景有很大影响吗?(例如,它们位于
      select
      语句上)
  • 我更关心的是GCD在这个应用程序中的影响。我对GCD内部工作原理的理解是,它是一个动态缩放的线程池,与调度程序交互,并将尝试添加更多线程以适应负载。在我看来,在我的场景中,这几乎完全会对性能产生负面影响。(即,在内核已完全消耗的系统中)正确吗
我不是x86体系结构方面的专家(因此希望有更有经验的人能加入进来),但下面是对您的问题的一些高级回答

我听说ARM并没有像x86那样进行超线程处理[…]

正确,超读是Intel芯片的专有设计功能。据我所知,没有类似的ARM硅技术

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

情况未必如此,尽管在许多情况下都可能发生这种情况。这实际上更多地取决于每线程计算的性质……你只是在做大量的计算,还是在做大量的阻塞/等待IO?无论哪种方式,这种降级都会发生在两种体系结构上,这更像是一个一般的线程调度问题。在超线程Intel世界中,操作系统将每个“物理核”视为两个“逻辑核”,它们共享相同的资源,但有自己的管道和寄存器集。维基百科的文章说:

每个逻辑处理器都可以单独暂停、中断或定向以执行指定的线程,与共享同一物理核心的其他逻辑处理器无关。[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一无所知,所以不能对此发表评论

最后,我想说,最好的办法是在两种体系结构上对应用程序进行基准测试。看看你的瓶颈在哪里。是内存访问吗?保留缓存