小编Mic*_*ant的帖子

对每个进程使用带有不同随机种子的python多处理

我希望并行运行几个模拟实例,但每个模拟都有自己独立的数据集.

目前我实现如下:

P = mp.Pool(ncpus) # Generate pool of workers
for j in range(nrun): # Generate processes
    sim = MDF.Simulation(tstep, temp, time, writeout, boundaryxy, boundaryz, relax, insert, lat,savetemp)
    lattice = MDF.Lattice(tstep, temp, time, writeout, boundaryxy, boundaryz, relax, insert, lat, kb, ks, kbs, a, p, q, massL, randinit, initvel, parangle,scaletemp,savetemp)
    adatom1 = MDF.Adatom(tstep, temp, time, writeout, boundaryxy, boundaryz, relax, insert, lat, ra, massa, amorse, bmorse, r0, z0, name, lattice, samplerate,savetemp)        
    P.apply_async(run,(j,sim,lattice,adatom1),callback=After) # run simulation and ISF analysis in each process
P.close() …
Run Code Online (Sandbox Code Playgroud)

python multiprocessing

20
推荐指数
2
解决办法
1万
查看次数

如何强制openMP以特定顺序运行迭代

我使用openMP并行运行模拟实例.

#pragma omp parallel for private(part) shared(P,lfcc,temp)
for (part = 0; part < P->Parts; part++)
Run Code Online (Sandbox Code Playgroud)

循环的一部分检查索引号为"part"的输出文件是否已经存在(因此我可以对某个"Parts"值运行模拟,然后在不覆盖现有结果的情况下增加它).但是,这需要迭代按顺序运行.也就是说,对于n个线程,它应该首先同时运行部分(1) - (n),然后是部分(n + 1) - (2n),依此类推.现在(3个线程并行运行,"parts"设置为N),行为不同,运行第一部分(0),(N/3),(2N/3),然后是(1),(N/3 + 1),(2N/3 + 1)等.

假设现在,我最初想要30个部分全部完成.然后我决定我需要更多的零件并将"零件"改为45.然后第一个螺纹得到零件(1) - (15),第二个(16) - (30)和第三个(31-45).前两个线程很快发现所有已分配的部分都已经完成,并且将使最后一个线程单独工作(如果我在程序终止之前放置了一个障碍子句).

一个简单的解决方案是让"part"变量不是以0开始,而是以m + 1开始,其中m是先前完成的部分的数量.但我想知道是否有可能强制openMP以上面以粗体显示的顺序运行迭代.

c openmp

6
推荐指数
2
解决办法
3545
查看次数

使用超线程运行模拟使运行时间加倍

我使用python/numpy/cython编写的模拟.由于我需要平均多次模拟运行,因此我使用多处理模块批量运行所有单独的模拟运行.

在办公室我有一个带HT的i7-920工作站.在家里我没有i5-560.我想我可以在办公室的每一批中运行两倍的模拟实例,并将我的运行时间缩短一半.令人惊讶的是,与我在家庭工作站上的时间相比,每个实例的运行时间增加了一倍.它在家中并行运行3个模拟实例需要8分钟,而在办公室运行6个实例大约需要15分钟.使用'cat/proc/cpuinfo'我验证了'siblings'= 8和'cpu cores'= 4,因此启用了HT.

我不知道任何"总运行时间保护"法律(虽然从科学的角度来看它可能非常有趣:)),并且在这里跳跃的人可能会对这个难题有所了解.

python linux multiprocessing hyperthreading

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

处理大型变量并将其传递给python中的函数\对象

我发现自己需要处理带有大量变量的函数和对象.

对于特定情况,请考虑来自分离模块的函数,该函数接受N个不同的变量,然后将它们传递给新的实例化对象:

def Function(Variables): 
    Do something with some of the variables
    object1 = someobject(some of the variables)
    object2 = anotherobject(some of the variables, not necessarily as in object1)
Run Code Online (Sandbox Code Playgroud)

虽然我可以传递一长串变量,但我不时会发现自己对一个函数进行了更改,这需要对其可能调用的其他函数或它可能创建的对象进行更改.有时,变量列表可能会略有变化.

是否有一种很好的方式来传递大量变量并保持灵活性?

我尝试以下列方式使用kwargs:

def Function(**kwargs):

    Rest of the function
Run Code Online (Sandbox Code Playgroud)

并且调用Function(**somedict),其中somedict是一个字典,其中包含我需要传递给Function的所有变量的键和值(可能还有更多).但我得到一个关于未定义的全局变量的错误.

EDIT1:

我将在稍后发布这段代码,因为我现在不在家或实验室.直到那时我会尝试更好地解释这种情况.

我有一个分子动力学模拟,它需要几十个参数.很少需要迭代参数(例如温度).为了充分利用四核处理器,我并行运行了不同的迭代.因此,代码以不同迭代的循环开始,并且在每次传递时将该迭代的参数发送到工作池(使用多处理模块).它类似于:

P = mp.pool(number of workers) # If i remember correctly this line 
for iteration in Iterations:
     assign values to parameters
     P.apply_async(run,(list of parameters),callback = some post processing)
P.close()
P.join()
Run Code Online (Sandbox Code Playgroud)

函数run获取参数列表并生成模拟对象,每个参数都将一些参数作为其属性.

EDIT2:

这是有问题的功能的一个版本.**kwargs包含'sim','lattice'和'adatom'所需的所有参数.

def run(**kwargs): 
"""'run' runs a …
Run Code Online (Sandbox Code Playgroud)

python argument-passing

2
推荐指数
1
解决办法
2901
查看次数