小编Ray*_*let的帖子

mpi中的Python多处理

我有一个使用多处理模块编写的python脚本,以便更快地执行.计算是令人尴尬的并行,因此效率随着处理器的数量而变化.现在,我想在MPI程序中使用它,该程序管理跨多台计算机的MCMC计算.此代码调用system()来调用python脚本.但是,我发现当它以这种方式调用时,使用python多处理的效率提升就会消失.

当从MPI调用时,如何让我的python脚本保持多处理的速度增益?

这是一个简单的例子,它类似于我想要使用的更复杂的代码,但显示相同的一般行为.我写了一个名为junk.py的可执行python脚本.

#!/usr/bin/python
import multiprocessing
import numpy as np

nproc = 3
nlen = 100000


def f(x):
    print x
    v = np.arange(nlen)
    result = 0.
    for i, y in enumerate(v):
        result += (x+v[i:]).sum()
    return result


def foo():
    pool = multiprocessing.Pool(processes=nproc)
    xlist = range(2,2+nproc)
    print xlist
    result = pool.map(f, xlist)
    print result

if __name__ == '__main__':
    foo()
Run Code Online (Sandbox Code Playgroud)

当我自己从shell运行它时,使用"top"我可以看到三个python进程,每个进程在我的16核机器上占用100%的cpu.

node094:mpi[ 206 ] /usr/bin/time junk.py
[2, 3, 4]
2
3
4
[333343333400000.0, 333348333450000.0, 333353333500000.0]
62.68user 0.04system 0:21.11elapsed 297%CPU (0avgtext+0avgdata 16516maxresident)k
0inputs+0outputs (0major+11092minor)pagefaults …
Run Code Online (Sandbox Code Playgroud)

python mpi multiprocessing

13
推荐指数
1
解决办法
6122
查看次数

默认情况下使用unifdef省略未定义的预处理器分支的方法?

我正在使用包含许多编译选项的复杂C代码.这使得代码非常难以阅读.我想生成一个反映实际编译方式的代码副本.我使用"unifdef"实用程序得到了相当不错的结果,直到最近我还不知道.但是,我很困惑,为什么它如此难以调用,我想知道我是否遗漏了一些东西.

考虑这个例子:

#ifdef A
  printf("A\n");
#endif
#ifdef B
  printf("B\n");
#endif
Run Code Online (Sandbox Code Playgroud)

如果你使用"unifdef -DA junk.c"调用unifdef,你会得到:

  printf("A\n");
#ifdef B
  printf("B\n");
#endif
Run Code Online (Sandbox Code Playgroud)

因为你没有告诉unifdef B未定义,所以它没有把它拿出来.

我希望该实用程序表现得这样,当我说unifdef -DA时,我得到了:

  printf("A\n");
Run Code Online (Sandbox Code Playgroud)

这将对应于C预处理器实际执行的操作:省略了未定义的任何分支.

要使用unifdef获得此行为,我似乎需要使用"unifdef -DA -UB junk.c",明确告诉它B未定义.虽然也许我错过了一种更简单的方式来调用它.

我写了一个python脚本,从我正在使用的代码的Makefile中生成所需的-D和-U标志的长列表(通常每个例程80个).结果非常好.但我想知道这样的剧本是否真的有必要.

另外一个实用程序(sunifdef?coan?)也可能已经内置了我想要的行为; 如果是的话,请提及.

c c-preprocessor

4
推荐指数
1
解决办法
2412
查看次数

标签 统计

c ×1

c-preprocessor ×1

mpi ×1

multiprocessing ×1

python ×1