Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 28, 2011 04:07:21

user32
От:
Зарегистрирован: 2011-06-09
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите распараллелить вычисления в программе

вот кусок кода где счет происходит

#поиск d
brk = 0
for d in xrange(2, 10):

combi_n_list = combi_n(len(matrix_h), d)
permit_combi_n_list = permit_combi_n(d)

for i in xrange(len(combi_n_list)):
for j in xrange(len(permit_combi_n_list)):
if check_vector(mult_summ (combi_n_list[i], permit_combi_n_list[j])) == 1:
print "<h1>Min code dist. = "+str(d)+"</h1>"
rezult_string = copy.deepcopy(combi_n_list[i])
rezult_coeff = copy.deepcopy(permit_combi_n_list[j])
brk = 1
break
if brk == 1:
break
if brk == 1:
break
как я себе представляю необходимое распараллеливание:

заходим в основной цикл for d in xrange(2, 10):
тут генерим два множества combi_n_list и permit_combi_n_list. в зависимости от параметров множества могут быть довольно блольшие. до несколько тысяч элементов, где элементы массивы

итак, сгенерировали множества. далее нужно распределить вычисления.
создать N потоков. где N - количество элементов в списке combi_n_list (те потоков может быть очень много, 2000-3000, питон позволит сделать столько? и есть ли смысл)

далее в каждый поток закидываем i-й элемент combi_n_list (т.е. по одному элементу на поток, все разные), закидываем в каждый массив permit_combi_n_list.
итак данные в каждый поток заряжены, начинаем в каждом потоке цикл проверки, вот этот:

for j in xrange(len(permit_combi_n_list)):
if check_vector(mult_summ (combi_n_list[i], permit_combi_n_list[j])) == 1:
print "<h1>Min code dist. = "+str(d)+"</h1>"
rezult_string = copy.deepcopy(combi_n_list[i])
rezult_coeff = copy.deepcopy(permit_combi_n_list[j])
brk = 1
break
тут combi_n_list как раз тот элемент который мы закинули в поток.

и так, вот наши потоки считают, считают и если хотя бы в одном потоке выполнилось вот это условие if check_vector(mult_summ (combi_n_list, permit_combi_n_list)) == 1:
то записываем результат из потока который выполнился после условия, вот этот
print “<h1>Min code dist. = ”+str(d)+“</h1>”
rezult_string = copy.deepcopy(combi_n_list)
rezult_coeff = copy.deepcopy(permit_combi_n_list)
и убиваем все потоко и новые не запускаем, вообще убиваем основной цикл, а результаты нужно сохранить в переменных….

плз помогите реализовать…



Офлайн

#2 Сен. 28, 2011 05:58:29

dimabest
От:
Зарегистрирован: 2009-02-12
Сообщения: 253
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите распараллелить вычисления в программе

Потоки не ускорят вычисления. Смотреть нужно в сторону процессов.
Я когда-то распараллеливал вычисления - на 4-ядерном процессоре получил ускорение всего в 2.7 раза.



Офлайн

#3 Сен. 28, 2011 08:27:45

user32
От:
Зарегистрирован: 2011-06-09
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите распараллелить вычисления в программе

ну либо не потоки а процессы создавать…я не в курсе как это организовать, но сделать надо чтобы прога вычисляла все одновременно а не по очереди….иначе ждать результат несколько часа если не больше



Офлайн

#4 Сен. 28, 2011 10:37:45

user32
От:
Зарегистрирован: 2011-06-09
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите распараллелить вычисления в программе

плз кто сможет помочь, могу оплатить работу…



Офлайн

#5 Сен. 28, 2011 11:06:56

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Помогите распараллелить вычисления в программе

по простому - можно 10 раз одновременно запустить скрипт с разными параметрами, вот и будет “многопроцессорная” обработка
а вот пример “мултипроцессинга” питоном

Отредактировано (Сен. 28, 2011 11:08:02)

Офлайн

#6 Сен. 28, 2011 15:36:25

user32
От:
Зарегистрирован: 2011-06-09
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите распараллелить вычисления в программе

сделал так

#поиск d

def prcess (permit_combi_n_list, combi_n_list_i, d):
for j in xrange(len(permit_combi_n_list)):
if check_vector(mult_summ (combi_n_list_i, permit_combi_n_list[j])) == 1:
rezult_message = "<h1>Min code dist. = "+str(d)+"</h1>"
rezult_string = copy.deepcopy(combi_n_list_i)
rezult_coeff = copy.deepcopy(permit_combi_n_list[j])
brk = 1
break




brk = 0
for d in xrange(2, 10):
from multiprocessing import Process

combi_n_list = combi_n(len(matrix_h), d)
permit_combi_n_list = permit_combi_n(d)
mass_prc = range(len(combi_n_list))

for i in xrange(len(combi_n_list)):
mass_prc[i] = Process(target=prcess, args=(permit_combi_n_list,combi_n_list[i], d,))
mass_prc[i].start()

for i in xrange(len(combi_n_list)):
mass_prc[i].join()
if brk == 1:
break
if brk == 1:
break
питон выдал это:

Traceback (most recent call last):
File “C:\Users\vaio\Desktop\codenew.py”, line 690, in <module>
mass_prc.start()
File “C:\Python27\lib\multiprocessing\process.py”, line 104, in start
self._popen = Popen(self)
File “C:\Python27\lib\multiprocessing\forking.py”, line 247, in __init__
to_child.close()
IOError: Invalid argument

как грамотно сделать чтобы заработало?



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version