0

我正在尝试在 python 中使用 MPI 为中点集成做一些并行计算。我对 MPI 不是很熟悉,我已经查看了一些示例来生成我迄今为止所拥有的内容。我遇到了几个错误,其中 MPI.COMM 无法识别几个输入参数。同样,我对 MPI 并不熟悉。

下面我附上了我的代码:

from mpi4py import MPI
import numpy as np
from numpy import *
import time

#initialize variables
n = 10e5 #number of increments within each process
a = 0.0; #lower bound
b = 5.0; #upper bound
dest = 0; #define the process that computes the final result

#Functions
def integral(my_a, num, h):
    s = 0;
    h2 = h/2;
    for i in range(0,num):
        temp = my_a + i*h;
        s = s + fct(temp+h2)*h;
    return (s)

def fct(x):
    return x**2;

#Start the MPI process
comm = MPI.COMM_WORLD
p = comm.Get_size(); #gather number of processes
print "Number of processes (p): ", p;
myid = comm.Get_rank() #gather rank of the comm (number of cores)
print "Rank of (p): ", myid;

h = (b-a)/n; #length of increment
num = int(n/p); #number of intervals calculated by each process
print "Number of intervals calculated by a process: ", num;
my_range = (b-a)/p; #range per process
my_a = a + myid*my_range; #next lower limit
ti = time.clock();
my_result = integral(my_a,num,h) #get the result

print "Process " + str(myid) + " has the partial result of " + str(my_result) + ".";

if myid == 0:
    result = my_result;
    for i in range(1,p):
        source = 1;
        comm.recv(my_result, dest=1, tag=123);
        result = result + my_result;
    print "The result = " + str(result) + ".";

else :
    comm.send(my_result, source=0, tag=123);
    MPI_Finalize();


tf = time.clock();
print "Time(s): ", tf-ti;

这是我尝试运行此代码时遇到的错误:

--------------------------------------------------------------------------
*******************************-VirtualBox ~/Documents/ME701/HW/HW5 $ mpirun -np 2 python HW5_prb3.py
Number of processes (p):  2
Rank of (p):  1
Number of intervals calculated by a process:  500000
Number of processes (p):  2
Rank of (p):  0
Number of intervals calculated by a process:  500000
Process 1 has the partial result of 36.4583333333.
Traceback (most recent call last):
  File "HW5_prb3.py", line 50, in <module>
    comm.send(my_result, source=0, tag=123);
  File "Comm.pyx", line 1127, in mpi4py.MPI.Comm.send (src/mpi4py.MPI.c:90067)
**TypeError: send() got an unexpected keyword argument 'source'**
Process 0 has the partial result of 5.20833333333.
Traceback (most recent call last):
  File "HW5_prb3.py", line 45, in <module>
    comm.recv(my_result, dest=1, tag=123);
  File "Comm.pyx", line 1142, in mpi4py.MPI.Comm.recv (src/mpi4py.MPI.c:90513)
**TypeError: recv() got an unexpected keyword argument 'dest'**
-------------------------------------------------------
Primary job  terminated normally, but 1 process returned
a non-zero exit code.. Per user-direction, the job has been aborted.
-------------------------------------------------------
--------------------------------------------------------------------------
mpirun detected that one or more processes exited with non-zero status, thus causing
the job to be terminated. The first process to do so was:

  Process name: [[45152,1],1]
  Exit code:    1
--------------------------------------------------------------------------
*******************************-VirtualBox ~/Documents/ME701/HW/HW5 $ 

中点积分的答案应该是 41.66667。我的老师只是想让我们对并行计算进行一次简单的时间研究,这样我们就可以看到它的力量。

感谢您的时间。

4

1 回答 1

1

我猜您只是混淆了send参数recv-source是您从中接收数据的进程等级, ( destinationdest的缩写)是您将数据发送到的进程等级(如果需要,您可以查看文档)。

因此,只需在发送和接收中交换sourcedest关键字就可以了。

于 2014-11-29T09:17:29.723 回答