并行计算中出现了一个奇怪的现象

电脑是32核的,但是decomposePar分了128个也能算起来?并且最多能分到196
之前在网上看到的资料都是说有几个核就分几个块,比较疑惑,是我对并行计算以及核心数的理解有错误吗?
还未比较二者计算速度的差别。
想请大佬解惑~~~ :grin:
配置如下,版本为openfoamv-2112

在很多时候我们所直呼的 N核并行 不一定是真的在用N个物理CPU核心,为什么呢?有如下的原因

  1. 在一台计算机上,用户启动MPI并行程序时只能指定进程数,而不能指定核心数。进程是一个软件概念,我们运行的程序都会以进程的形式运行在计算机中,但是单纯谈论进程还没有涉及到硬件,启动程序之后,这些软件进程才会占用CPU资源,进而执行计算,此时才涉及硬件。而为什么很多时候我们把 mpirun -np N progeam 这样的方式叫做使用N核并行,是因为那些人(土豪)真的有这么多核心(大于等于N个),把需要联系的概念给简化了

  2. 楼主也提到32核心的电脑,计算域分解为128块也可以算,而且还能最大分解到196块,事实上这样是可以进行计算的,因为即使不做计算任务,一台正在运行的计算机也会运行很多进程,很多时候这些进程数比核心多,是因为操作系统在帮你调度,所以假设除CPU外其他所有硬件资源不受限制,那么装了一个32核心的电脑可以运行无数进程

  3. 接着楼主第二个问题,具体划分多少,这个取决于划分方式,不同的方式不一样,不过有一个宗旨就是尽可能减少通信,另外就是如果控制节点也做计算(比如我们拿自己的电脑算),尽量不要把资源占满,因为即使什么都不干,长时间待机都有可能蓝屏(比如菊硬 :rofl:),而我们需要做计算任务,不要把资源占满,留一两个核心给操作系统机动。当然超过了能不能算以及性能等衍生问题,具体分体具体分析,一般如果单进程占用资源过多可能会影响操作系统稳定

  4. 速度差异,这个看进程数和核心数,科学计算一般是CPU密集型任务,数据的计算量要远大于数据总量的,一核心对应一进程是比较理想的,进程数大于核心数,那么有些进程就要排队了,排队就意味着没有占用CPU,也就是没有计算

  5. 关于超线程,对科学计算来说用处基本不大,因为CPU密集型任务需要长时间占用CPU,很少涉及进程调度,况且频繁的上下文切换也会使性能下降,这是其一;其二是超线程技术并没有增加ALU,他增加的是寄存器,是用来保存等待占用CPU的上下文的。而超线程能够发光的地方是频繁的多任务切换(比如一边选歌试听,一边看电影,旁边还开着几个PDF阅读器翻论文,还打开微信聊着天等),这种需要频繁调度需要不停地进行上下文切换,当然电脑的速度不会让用户感觉到延迟,使用体验得到极大的提升

  6. 其他技术,OpenMP,CUDA等具体问题具体分析,就不展开了

  7. 也是一家之言,欢迎交流

1 个赞

一般来说CPU核心数小于网格分区数量都是可以的。