【发布时间】:2019-03-12 00:16:38
【问题描述】:
我正在设计一个 Python 程序来计算 k
我的意图是应用reduce 和broadcast 命令来并行化所有处理器之间的工作。我是 MPI 新手,不知道该怎么做,所以我在代码中注释掉了这两行。我很好奇我是否应该遵循特定的方向来完成 MPI 中的 reduce 和 broadcast 命令。我原来的代码是
import numpy as np
import platform
import sys
from mpi4py import MPI
comm = MPI.COMM_WORLD
id = comm.Get_rank( )
p = comm.Get_size( )
p=1
# Find the primes between 2 and k. Initialize k.
k=10
# Define a list S_k of the primes between 2 and k
primes=[]
# Define a list to store numbers that aren't prime between 2 and k.
not_prime = []
# Define a list S_k2 of the primes between k and k**2
primes2=[]
# Count the number of primes from 2 to k
for i in range(2, k+1):
if i not in not_prime:
primes.append(i)
for j in range(i*i, k+1, i):
not_prime.append(j)
# Find the number of primes between k and k**2
b=(k**2-k)/p
for n in range(int(k+(p-1)*b),int(k+(p)*b)):
counter = 0
for i in range(len(primes)):
if (n % primes[i]) == 0:
break
else:
counter = counter + 1
if (counter==len(S_k)):
primes2.append(n)
# I'm not sure what to use as parameters for comm.Reduce and comm.bcast
# comm.reduce = (primes2, op = MPI.SUM, root = 0 )
# comm.bcast |= (primes2, op = MPI.SUM, root = 0 )
print ("Number of processors: ",p)
print (primes2)
print((int(k+(p-1)*b),int(k+(p)*b)))
当针对 p=1 进行测试时,代码返回
Number of processors: 1
[11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
(10, 100)
当针对 p=2 进行测试时,代码返回
Number of processors: 2
[59, 61, 67, 71, 73, 79, 83, 89, 97]
(55, 100)
当针对 p=3 进行测试时,代码返回
Number of processors: 3
[71, 73, 79, 83, 89, 97]
(70, 100)
随着 p 的增加,primes2 中素数元素的数量减少。
理想情况下,我正在研究如何并行化代码,以便针对 p=3 的测试返回
Number of processors: 3
Processor 1 computed [11, 13, 17, 19, 23, 29, 31, 37]
Processor 2 computed [41, 43, 47, 53, 59, 61, 67]
Processor 3 computed [71, 73, 79, 83, 89, 97]
我认为这可以通过对 MPI 应用 reduce 和 broadcast 命令来完成。我不知道我应该如何调整
# comm.reduce = (primes2, op = MPI.SUM, root = 0 )
# comm.bcast |= (primes2, op = MPI.SUM, root = 0 )
以便各个处理器计算素数的子集。
【问题讨论】:
-
并行化代码的一种简单方法是让每个 MPI 任务根据排名在给定范围内查找素数(此处不需要通信)。然后你可能想
MPI_Gather()在每个等级上找到多少个素数,MPI_Gatherv()它们都可以在根等级上使用(然后你可以使用它们,或者简单地按顺序打印它们)。
标签: python mpi reduce broadcast