Распределенные вычисления с помощью Raspberry Pi
Оценка пользователей: / 2
ПлохоОтлично 
Distributed Computing-Raspberry PiРаспределенные вычисления предусматривают распределение вычислительной проблемы на несколько параллельных задач, которые будут выполняться двумя или более компьютерами в сети, образующими распределенную систему.
Это позволяет совместить в себе вычислительную мощность нескольких компьютеров для решения громоздких задач, которые включают обработку больших данных или требуют огромного количества итераций.
Сегодня существует несколько текущих крупномасштабных распределенных вычислительных проектов, охватывающих различные сферы, которые позволяют принять участие компьютерам со всего мира и многие из этих проектов уже работают в течение нескольких лет. Это показывает насколько большими могут быть вычислительные задачи в наши дни!
Вот несколько примеров:
Поиск чисел Мерсенна, которые являются простыми числами и соответствуют форме 2**n - 1, либо имеют только '1' в двоичной системе.
Поиск новых фундаментальных частиц на Большом адронном коллайдере в ЦЕРНе.
Запуск симуляции на составление протеинов, которые помогают изучению таких заболеваний, как болезнь Альцгеймера, Хантингтона и многих видов рака.
Исследование структуры и реакционной способности молекул с помощью квантовой химии и методов Монте-Карло.
Использование численного моделирования процесса познания, чтобы лучше понять разум.
Создание высокоточной 3D-модели галактики Млечный Путь.
Взлом трех исходящих сообщений Enigma, которые не были еще взломаны.
Демонстрация распределенных вычислений с использованием двух Pi
Для демонстрационных целей автор подключил 2 Raspberry Pi с помощью кабеля Ethernet и выполнил простую сортировку слиянием на большом массиве элементов.
Во-первых, вот код для алгоритма сортировки слиянием, написанный на python  (MergeSort.py):
import time
def merge(left,right): #Зливаємо разом 2 загальні списки
result = []
i, j = 0, 0
#Виконання за обома списками
while i < len(left) and j < len(right):
#Додавання меншого елемента списків в остаточний список
if left[i] <= right[j]:
result.append(left[i])
i += 1
else:
result.append(right[j])
j += 1
result += left[i:]
result += right[j:]
return result
def mergesort(lst):
#Якщо є тільки 1 елемент, то сортувати не потрібно
if len(lst) < 2:
return lst
#Ділимо список на 2 половини
middle = len(lst) / 2
#Рекурсивно розбиваємо і сортуємо кожну половину
left = mergesort(lst[:middle])
right = mergesort(lst[middle:])
#Зливаєтмо списки разом, як впорядковані
return merge(left, right)
Далее приведен код для использования алгоритма сортировки слиянием для сортировки массива 100000 элементов, используя только один Raspberry Pi (Merge1.py).
(Этот код будет использоваться в следующих программах, поэтому они размещены в том же каталоге перед их запуском!)
import MergeSort #Імпорт функцій злиття
import random
import time
#Створюємо масив для сортування
arraylength = 100000 #Довжина масиву для сортування
print 'Length of array is', arraylength
array = range(arraylength) #Створюємо масив
random.shuffle(array) #Перехід до масиву
#Процес сортування і час сортування
start_time = time.time() #Запуск часу старту
print 'Sorting array...'
array = MergeSort.mergesort(array) #Сортування масивуy
print 'Array sorted.'
time_taken = time.time() - start_time #Розрахунок і запис time_taken
print 'Time taken to sort is ', time_taken, 'seconds.'
Distributed Computing-Raspberry Pi-1
Выполнение задания только на одном Raspberry Pi занимает около 24 секунд.
Теперь давайте распределим задачи между двумя Raspberry Pi, но для этого мы сначала должны установить IP-адреса каждого Pi.
На первом Pi через командную строку настроим IP-адрес 192.168.1.1, и этот Pi будет выступать как сервер в сети:
sudo ifconfig eth0 192.168.1.1 broadcast 192.168.1.255 netmask 255.255.255.0
Аналогично, вводим следующий второй Pi, настроив IP-адрес 192.168.1.2, и этот Pi будет выступать как клиент:
sudo ifconfig eth0 192.168.1.2 broadcast 192.168.1.255 netmask 255.255.255.0
На первом Pi запустим следующий код (MergeServer.py):
import socket
import MergeSort #Імпорт функцій злиття
import random
import time
#Розбиваємо масив на п ділянок, де п - число процесорів
def breakarray(array, n):
sectionlength = len(array)/n #Довжина кожної секції
result = []
for i in range(n):
if i < n - 1:
result.append( array[ i * sectionlength : (i+1) * sectionlength ] )
# Включаємо всі елементи, які залишилися, в останню секцію
else:
result.append( array[ i * sectionlength : ] )
return result
#Створюємо масив для сортування
arraylength = 100000 #Length of array to be sorted
print 'Length of array is', arraylength
array = range(arraylength) #Створюємо масив
random.shuffle(array) #Перехід до
#Вказуємо інформація про процесори/комп'ютери
procno = 2 #Кількість процесорів
print 'Number of processors:', procno
procID = 0 #ID цього процесора(сервера)
addr_list = [] #Список адрес клієнтів
#Налаштовуємо мережу
HOST = ''
PORT = 50007
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((HOST, PORT))
s.listen(procno - 1) #Слухаємо для (п) числа клієнтських підключень
print 'Waiting for client...'
for i in range(procno - 1): #Підключаємося до всіх клієнтів
conn, addr = s.accept() #Приймаємо з'єднання від клієнта
print 'Connected by', addr
addr_list.append(addr) #Додаємо адресу в список адрес
#Процес сортування і час початку розподілених обчислень
start_time = time.time() #Записуємо час старту
sections = breakarray(array, procno) #Розбиваємо масив на розділи для кожного клієнта
for i in range(procno - 1): #Перетворення розділу масиву в рядок для відправки
arraystring = repr(sections[i+1])
conn.sendto( arraystring , addr_list[i] ) #Посилаємо рядок масиву
print 'Data sent, sorting array...'
array = MergeSort.mergesort(sections[procID]) #Сортуємо розділ і зберігаємо його в масиві
print 'Array sorted.'
for i in range(procno - 1): #Приймаємо сортовані розділи від кожного клієнта
arraystring = ''
print 'Receiving data from clients...'
while 1:
data = conn.recv(4096) #Отримуємо дані в шматках
arraystring += data #Додаємо дані в рядки масиву
if ']' in data: #Коли закінчене приймання даних
break
print 'Data received, merging arrays...'
array = MergeSort.merge(array, eval(arraystring)) #Об'єднуємо розділи поточного масиву від клієнтів
print 'Arrays merged.'
conn.close()time_taken = time.time() - start_time #Розраховуємо і записуємо time_taken
print 'Time taken to sort is ', time_taken, 'seconds.'
Когда строка "Waiting for client..." ("В ожидании клиента...") будет выведена в командной строке первого Pi, запустите следующий код на втором Pi (MergeClient.py):
import socket
import MergeSort
HOST = '192.168.1.1'
PORT = 50007
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
#Приймаємо рядки масиву в шматках
arraystring = ''
print 'Receiving data...'
while 1:
data = s.recv(4096) #Отримуємо дані в шматках
#Друк даних
arraystring += data #Додаємо дані в рядок масиву
if ']' in data: #Коли закінчене приймання даних
break
array = eval(arraystring)
print 'Data received, sorting array... '
#Сортуємо масив, який є розподіленим
array = MergeSort.mergesort(array)
print 'Array sorted, sending data...'
#Перетворюємо рядок масиву, щоб відправити назад на сервер
arraystring = repr(array)
s.sendall(arraystring) #Посилаємо рядок масиву
print 'Data sent.'
s.close()
Distributed Computing-Raspberry Pi-2
Distributed Computing-Raspberry Pi-3
Время, необходимое для сортировки массива, снизилось примерно до 16 секунд, что не является 2-кратным снижением из-за накладных расходов при обработке и передаче данных между двумя устройствами. Это увеличение ускорения будет более заметным с использованием большего количества Raspberry Pi, подключенных через концентратор.
Distributed Computing-Raspberry Pi-4
Что дальше?
Надеемся, что этот действительно краткий обучающий курс дал Вам представление о том, насколько близкими становятся распределенные вычисления и как это просто осуществить. Есть много примеров программ из этого и, возможно, Вы могли бы начать свой собственный проект распределенных вычислений с помощью Raspberry Pi (и друга или друзей)!
(Источник EN: cl.cam.ac.uk)
 
>
КнигаНовости Практика поискаПартнерыО нас
Підтримка та дизайн: Могильний С.С. Шаблон: Joomla Templates by BuyHTTP Joomla Hosting