并行编程 - 将MPI应用于质数筛



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')

会告诉您是否正在运行不同的物理节点。

最新更新