mpiexec с mpi4py не выполняется при запуске Raspberry Pi - PullRequest
0 голосов
/ 09 июня 2019

У меня есть программа на python, которая обрабатывает простые числа, которые я настроил с помощью mpi4py, для запуска на моем кластере raspberry pi, и я обычно могу запустить команду из любого каталога, но когда я помещаю ее в rc.local, онане работает.Я могу нормально запустить файл rc.local из командной строки, а затем он запускается как следует.

Я подключаюсь к своему Raspberry pi через ssh, но на данный момент я не подключен к нему, иначе я бы подключилсямонитор к нему, чтобы проверить наличие сообщений об ошибках при загрузке.Я настроил переадресацию портов на нашем домашнем wifi и изменил порт по умолчанию для ssh, чтобы сделать его более безопасным.

команда внутри файла rc.local:

mpiexec -n 16 -f /home/pi/machinefile python3 /home/pi/clusterprime.py

код для разработкипростые числа:

from mpi4py import MPI

def innit():
        #setting gloabl variables:
        global comm
        global rank
        global size
        global name

        #setting up mpi4py:
        comm = MPI.COMM_WORLD
        rank = comm.rank
        size = comm.size
        name = comm.name

        #checking if thread is master or slave:
        if rank == 0:
                mastersetup()
        main()

def master(thread):
        global n
        global nLock
        global cLock
        global primes
        global c

        print("Started thread: {}".format(thread))
        t = time.time()
        while True:
                with nLock:
                        n+=2
                comm.send(n, dest=thread)
                num, p = comm.recv(source=thread)
                if p:
                        times.append(time.time()-t)
                        t = time.time()
                        print(num)
                        primes.append(num)
                        with cLock:
                                c+=1

def mastersetup():
        #setting global module variables:
        global time
        #master setup:
        import pickle
        import threading
        import time

        #setting global pickle variables:
        global prime
        global n
        global primes

        primes = pickle.load(open("/home/pi/primes/primes.p", "rb"))
        n = primes[len(primes)-1]

        #setting global threading variables:
        global nLock
        global cLock
        global c
        global times

        nLock = threading.Lock()
        cLock = threading.Lock()
        threads = []
        c = 0
        times = []
        t = 0
        for x in range(1,size):
                threads.append(threading.Thread(target=master, args=[x]))
        for x in threads:
                x.daemon = True
               x.start()

        while True:
                if c >= size*5:
                        t = 0
                        with cLock:
                                c = 0
                        pickle.dump(primes,open("/home/pi/primes/primes.p", "wb"))
                        for x in times:
                                t+=x
                        t = t/len(times)/size
                        print(t)
                        t = []

                while len(primes) >= 200:
                        primes.remove(primes[0])

def main():

        while True:
                n = comm.recv(source=0)
                p = isprime(n)
                comm.send((n, p), dest=0)

def isprime(num):
        for n in range(3, round(num/2),2):
                if num%n == 0:
                        return(False)

        return(True)

if __name__ == "__main__":
        innit()
...