Вот мой код:
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 узлов, чтобы выполнить этот код и добиться максимального распараллеливания?
Заранее спасибо!