假设我在多核CPU上运行多个python进程(而不是线程)(比如4)。GIL是进程级别,因此特定流程中的GIL不会影响其他流程。
我在这里的问题是,GIL在一个过程中是否只会占据4个核心中的一个核心,还是会占据所有4个核心?
如果一个进程同时锁定所有内核,那么多处理就不应该比python中的多线程更好。如果不是,核心是如何分配给不同的进程的?
作为一个观察,在我的系统是8个内核(4*2,因为超线程),当我运行一个CPU绑定进程时,8个核心中有4个的CPU使用量增加。
简化如下:
运行在4个核心CPU上的4个python线程(在一个进程中)将比执行相同工作的单个线程花费更多的时间(考虑到工作完全是CPU绑定的)。做这个工作量的4种不同的过程会不会减少近4倍的时间?
发布于 2018-04-24 05:06:29
Python不会对将进程或线程绑定到核心做任何事情;它只是把事情留给操作系统处理。当您生成一组独立的进程(或线程,但在Python中很难做到这一点)时,操作系统的调度程序将快速而有效地将它们分散到您的内核中,而不需要您做任何事情(除非有非常严重的病理病例)。
吉尔和这里没有关系。稍后我会讲到这一点,但首先让我们解释一下什么是相关的。
你没有8个核心。您有4个核,每个核都是超螺纹。
现代核具有大量的“超级标量”容量。通常情况下,流水线中排队的指令不够独立,无法充分利用这种能力。超线程所做的是允许内核在发生这种情况时从第二个管道中获取其他指令,而这些指令实际上保证是独立的。但是它只允许这一点,而不是需求,因为在某些情况下( CPU通常可以比您更好地决定),缓存局部性的成本将比并行性的收益更糟糕。
因此,根据实际运行的负载,有四个超线程核心,您可能得到充分的800%的CPU使用率,或者您可能只得到400%,或(经常)之间的某个地方。
我假设您的系统配置为向用户报告8个核心,而不是4个,因为这是默认的,而且至少有8个进程或池具有默认的proc计数和至少8个任务--显然,如果所有这些都不是真的,您就不可能获得800%的…使用率
我还假设您没有使用显式锁、其他同步、Manager对象或任何将序列化代码的方法。如果你这样做了,显然你不能得到完全的并行性。
我还假设您没有使用(可变的)共享内存,就像每个人都写到的multiprocessing.Array一样。这可能导致缓存和页冲突,这些冲突几乎与显式锁一样糟糕。
和吉尔有什么关系?如果您在一个进程中运行多个线程,并且它们都是受CPU约束的,并且它们都花费了大部分时间运行Python代码(比方说,大部分时间用于运行释放GIL的numpy操作),那么一次只能运行一个线程。你可以看到:
但是不是运行多线程,而是运行单独的进程,每个进程都有自己的完全独立的GIL。这就是为什么你看到四个核心在100%而不是仅仅一个。
发布于 2018-04-24 05:06:15
进程到CPU/CPU核心分配由操作系统处理。
https://stackoverflow.com/questions/49993687
复制相似问题