如何拆分程序以充分利用多CPU,多核和超线程?

tel*_*oon 3 multithreading multicore

我有一堆命令要执行基因分离.例如:

msclle_program -in 1.txt
msclle_program -in 2.txt
msclle_program -in 3.txt
      .........
msclle_program -in 10.txt
Run Code Online (Sandbox Code Playgroud)

这些命令彼此独立.

环境是Linux桌面,英特尔I7(4芯/ 8螺纹7,12G存储器

我可以将这些命令拆分为不同的n.sh程序并同时运行它们.

我的问题是如何充分利用多CPU,多核和超线程来使程序运行得更快?

更具体地说,我应该拆分多少个程序文件

我个人的理解是:

  1. 分成7个程序文件.因此每个CPU将100%运行一个程序
  2. 使用一个CPU,CPU将自己利用其多核和多线程.

这是真的吗?

非常感谢你的评论.

小智 6

答案并不简单或直接,每个CPU将任务分成一个程序可能不是最优的,可能确实很差甚至非常差.

首先,据我所知,你有七个四核CPU(大概有八个,但你要为操作系统保存一个?).如果在每个CPU上运行单线程进程,则将在单个核心上使用单个线程.其他三个核心和所有超线程将不会被使用.

硬件和操作系统无法在多个核心上拆分单个线程.

但是,您可以为每个CPU运行四个单线程进程(每个核心一个),甚至八个(每个超线程一个).这是否最佳取决于过程所做的工作; 特别是它们的工作集大小和内存访问模式,以及硬件缓存安排; 缓存级别的数量,大小和共享.还需要考虑核心的NUMA布置.

基本上,一个额外的线程必须提供相当多的加速,超过它在缓存利用率,主存储器访问和预取中断方面的成本.

此外,因为工作集超过某些缓存限制的效果是深远的,所以看起来好的一个或两个核心可能令人震惊的四或八,所以你甚至不能尝试一个核心并假设结果是有用的八.

快速浏览一下,我看到i7有一个小的L2缓存和一个巨大的L3缓存.鉴于您的数据集,如果处理大量数据,我不会感到惊讶.问题是它是否是按顺序处理的(例如,预取是否有效).如果数据没有按顺序处理,您可以通过减少并发进程数来做得更好,因此它们的工作集往往适合L3缓存.我怀疑如果你运行8或16个进程,L3缓存将被敲打 - 溢出.OTOH,如果您的数据访问是非顺序的,那么L3缓存无论如何都不会为您节省费用.