我以前写过serial program来计算Eratosthenes筛网的变体。我正在尝试调整此程序,以便它可以通过MPI在并行编程环境中工作。我正在与其他人一起完成这项任务,看来我们已经成功地实现了部分代码的并行化。我不确定我们编写的内容是否并行化。
斯科特·里奇韦(Scott Ridgway)在Parallel Scientific Computing中描述了Eratosthenes筛网的变体。在第一章中,他描述了素数筛。修改后的筛子将搜索k <= n <= k ^ 2之间的素数,而不是找到最大为k的素数。我已经通过以下代码完成了此操作。为了并行处理此代码,我用Python编写了以下程序(为了运行该程序,我在安装了Windows的MPI的Jupyter Notebook中进行了测试)
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并行化素数筛的计算。我们如何验证编写的并行化成功?我们有什么方法可以验证不同的处理器是否在上面的代码中拆分工作?