MPI порождает все процессы на главном узле - PullRequest
0 голосов
/ 17 июня 2020

Вот мой код:

import sys
sys.path.append("/apps/anaconda3/pkgs/qgis-3.8.1-py37h59d211b_0/lib")
import qgis
import os
from qgis.core import *
from mpi4py import MPI
from timeit import default_timer as dt
import numpy as np


# Initialize MPI
comm = MPI.COMM_WORLD
rank = int(comm.Get_rank())

if(rank==0):
    print("Project loaded successfully")

# counter function
def counter(feats,vectors,rank):
    cnt = 0
    for feature in feats:
        cands = vectors.getFeatures(QgsFeatureRequest().setFilterRect(feature.geometry().boundingBox()))
        for area_feature in cands:
            if feature.geometry().intersects(area_feature.geometry()):
                cnt+=1
    return cnt

start = MPI.Wtime()

# loading layers
layer_ids = list(project.mapLayers().keys())
vec = layer_ids[0]
vectorlayer = project.mapLayers()[vec]
grid = QgsVectorLayer("/home/600.shp", "grid", "ogr")

# define number of jobs
cores = comm.size()

# split data
gfeats = np.array(list(grid.getFeatures()))
subs = np.array_split(gfeats,cores)

# start process based on rank
print("rank : ",rank," len : ",len(sub[rank]))
value = counter(subs[rank],vectorlayer,rank)

ttime = MPI.Wtime()-start


# perform the reductions:
tcount = comm.reduce(value,op=MPI.SUM, root=0)
tstime = comm.reduce(ttime, op=MPI.MAX, root=0)

# Print on rank 0 
if rank == 0:
    print(' Rank 0: count =    ',tcount)
    print(' Rank 0: time  =    ',tstime)

Выполнено с использованием:

mpiexec -n 50 python mptest.py
  • В коде я разбиваю массив на несколько процессов, которые я упомянул , предположим 50, используя np.array_split ()
  • После, я использую ранг в качестве индекса и выполняю только эту разделенную часть в каждом процессе (или ранге).
  • HP C содержит 5 узлов с 24 ядрами каждый.
  • При запуске кода время такое же, как и при использовании модуля многопроцессорности в python
  • , что означает, что все процессы запускаются на один узел.

Как я могу использовать все 5 узлов, чтобы выполнить этот код и добиться максимального распараллеливания?

Заранее спасибо!

...