我正在使用Python开发一款科学计算工具,它应该能够在NUMA共享内存环境中分配工作到多个核心上。我正在寻找最有效的方法。
线程不幸地退出游戏了,因为Python的全局解释器锁定,这让fork成为我唯一的选择。对于进程间通信,我认为我的选择是管道、套接字或mmap。如果列表中有遗漏的,请指出。
我的应用程序将需要相当多的进程间通信,并访问一些共同数据。我的主要关注点是延迟。
我的问题:当我fork一个进程时,它的内存是否会位于它被分配到的核心附近?由于*nix上的fork是写时复制,所以最初我认为这不可能是这种情况。我想强制进行内存复制以获得更快的内存访问,如果是这样,最好的方法是什么?如果我使用mmap进行通信,那么该内存还会分布在多个核心上,还是只会位于一个核心上?是否存在透明重新定位数据以优化访问的进程?是否有一种直接控制物理分配的方法,或者一种请求有关分配信息以帮助优化的方法?
在更高的层面上,这些事情中哪些是由硬件决定的,哪些是由操作系统决定的?我正在购买一台高端多插槽机器,对于AMD Opteron和Intel Xeon之间的选择存在疑问。具体硬件对以上任何问题的影响是什么?
线程不幸地退出游戏了,因为Python的全局解释器锁定,这让fork成为我唯一的选择。对于进程间通信,我认为我的选择是管道、套接字或mmap。如果列表中有遗漏的,请指出。
我的应用程序将需要相当多的进程间通信,并访问一些共同数据。我的主要关注点是延迟。
我的问题:当我fork一个进程时,它的内存是否会位于它被分配到的核心附近?由于*nix上的fork是写时复制,所以最初我认为这不可能是这种情况。我想强制进行内存复制以获得更快的内存访问,如果是这样,最好的方法是什么?如果我使用mmap进行通信,那么该内存还会分布在多个核心上,还是只会位于一个核心上?是否存在透明重新定位数据以优化访问的进程?是否有一种直接控制物理分配的方法,或者一种请求有关分配信息以帮助优化的方法?
在更高的层面上,这些事情中哪些是由硬件决定的,哪些是由操作系统决定的?我正在购买一台高端多插槽机器,对于AMD Opteron和Intel Xeon之间的选择存在疑问。具体硬件对以上任何问题的影响是什么?