Я использую разреженную обработку массива тензоров, которую я построил с использованием словарей и счетчиков в Python. Я хотел бы использовать параллельную манипуляцию массивом. Суть в том, что у меня закончилось наличие счетчиков на каждом узле, которые я бы хотел добавить вместе, используя MPI.Allreduce (или другое приятное решение). Например, с счетчиками можно сделатьСуммируя объекты Python с Allreduce MPI
A = Counter({a:1, b:2, c:3})
B = Counter({b:1, c:2, d:3})
таким образом, что
C = A+B = Counter({a:1, b:3, c:5, d:3}).
Я хотел бы сделать это же операцию, но со всеми соответствующими узлами,
MPI.Allreduce(send_counter, recv_counter, MPI.SUM)
однако, MPI Безразлично Кажется, эта операция распознается на словари/счетчики, вызывая ошибку expecting a buffer or a list/tuple
. Является ли мой лучший вариант «User-Defined Operation», или есть способ заставить Allreduce добавлять счетчики? Спасибо,
EDIT (7/14/15): Я попытался создать пользовательскую операцию для словарей, но были некоторые несоответствия. Я написал следующее
def dict_sum(dict1, dict2, datatype):
for key in dict2:
try:
dict1[key] += dict2[key]
except KeyError:
dict1[key] = dict2[key]
и когда я сказал MPI о функции Я сделал это:
dictSumOp = MPI.Op.Create(dict_sum, commute=True)
и в коде, я использовал его в качестве
the_result = comm.allreduce(mydict, dictSumOp)
Однако, бросил unsupported operand '+' for type dict
, поэтому я написал
the_result = comm.allreduce(mydict, op=dictSumOp)
и теперь он бросает dict1[key] += dict2[key] TypeError: 'NoneType' object has no attribute '__getitem__'
так, по-видимому он хочет знать, что эти вещи словари? Как я могу сказать, что у них есть словарь типов?
Вы можете превратить операцию в список понимания? – Matt