i先前编写了一个序列程序来计算eratosthenes筛子的变体。我正在尝试调整此程序,以便它可以通过MPI在平行的编程环境中工作。我正在与其他人合作处理任务,看来我们已经成功地将一部分代码平行。我不确定我们写的是并行。
Scott Ridgway在平行科学计算中描述了Eratosthenes筛子的变体。在第一章中,他描述了所谓的质数筛子。修改后的筛子搜索k< = n< = k^2,而不是找到数字k的素数。我已经通过以下代码做到了这一点。为了并行化此代码,我在Python中编写了以下程序(为了运行该程序,我在Jupyter笔记本中使用MPI进行了测试以安装Windows):
import numpy as np
import platform
import sys
from mpi4py import MPI
comm = MPI.COMM_WORLD
id = comm.Get_rank ( )
p = comm.Get_size ( )
# k : Find the primes between 1 and k. k is set as a default value.
k=10
# define the list S_k of the primes between 2 and k
S_k=[]
# define the list S_k2[] of the primes between k and k**2
S_k2=[]
for i in range ( 2 + id, k + 1, p ):
flag=0
for j in range ( 2, i ):
if ( i % j ) == 0:
break
else:
flag=flag+1
if (flag==i-2):
S_k.append(i)
b=int(k**2-k)/p
for n in range(int(k+id*b),int(k+(id+1)*b)):
flag=0
for i in range(len(S_k)):
if (n % S_k[i]) == 0:
break
else:
flag=flag+1
if (flag==len(S_k)):
S_k2.append(n)
print (S_k2)
程序返回
[10, 11, 13, 14, 16, 17, 19, 20, 22, 23, 25, 26, 28, 29, 31, 32, 34, 35, 37, 38, 40, 41, 43, 44, 46, 47, 49, 50, 52, 53, 55, 56, 58, 59, 61, 62, 64, 65, 67, 68, 70, 71, 73, 74, 76, 77, 79, 80, 82, 83, 85, 86, 88, 89, 91, 92, 94, 95, 97, 98]
因此,似乎我们成功地创建了一个程序,该程序通过MPI平行于质数筛分的计算。我们如何验证我们写的是成功并行的?我们有什么办法可以验证不同的处理器是否正在将上述代码分类?
使用MPI处理记录的一种方法是使用提供的名称,该名称唯一标识每个节点。在这种情况下,只需添加print
语句:
print(MPI.Get_processor_name(),'is running')
会告诉您是否正在运行不同的物理节点。