【发布时间】:2011-12-08 16:49:51
【问题描述】:
我正在用 python 开发一个科学计算工具,它应该能够在 NUMA 共享内存环境中将工作分配到多个内核上。我正在寻找最有效的方法。
由于 python 的全局解释器锁,线程被排除在游戏之外,这使我唯一的选择是分叉。对于进程间通信,我想我的选择是管道、套接字或 mmap。如果此列表中缺少内容,请指出。
我的应用程序需要在进程之间进行相当多的通信,并需要访问一些公共数据。我主要担心的是延迟。
我的问题:当我 fork 一个进程时,它的内存是否会位于分配给它的核心附近?作为 *nix 副本中的 fork,最初我认为情况并非如此。我是否要强制复制以更快地访问内存,如果是这样,最好的方法是什么?如果我使用 mmap 进行通信,该内存是否仍可以分布在内核上,还是位于单个内核上?是否有透明地重新定位数据以优化访问的流程?有没有办法直接控制物理分配,或请求分配信息以帮助优化?
在更高的层次上,哪些是我的硬件决定的,哪些是由操作系统决定的?我正在购买一台高端多路机器,并在 AMD Opteron 和 Intel Xeon 之间犹豫不决。特定硬件对上述任何问题有何影响?
【问题讨论】:
-
如果代码是用 Python 编写的,那么担心这个级别的性能是愚蠢的——解释器的开销很可能会淹没 NUMA 所做的任何差异。
-
Python 可以调用用 C 编写的例程,例如 numpy。此外,Pypy 使 python 脚本相当高效。具有共享内存的多个进程如何与 NUMA 交互的问题也是一个有趣的问题。
-
确实,我认为 Python 是一种方便的语言,可以灵活地将 C 代码片段粘合在一起。如果以正确的方式完成,我相信解释器的开销可以保持在较低水平。
标签: python ipc fork shared-memory numa