Я разрабатываю программу на Python для вычисления числа простых чисел между k
Я собираюсь применить команды reduce
и broadcast
для распараллеливания работы между всеми процессорами.Я новичок в MPI и не знаю, как это сделать, поэтому я закомментировал эти две строки в коде.Мне любопытно, есть ли конкретное направление, которому я должен следовать, чтобы завершить команды reduce
и broadcast
в MPI.Мой оригинальный код
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.Я не уверен, как мне настроить
# comm.reduce = (primes2, op = MPI.SUM, root = 0 )
# comm.bcast |= (primes2, op = MPI.SUM, root = 0 )
, чтобы отдельные процессоры вычисляли подмножество простых чисел.