Python で辞書とカウンターを使用して作成したスパース テンソル配列操作を使用しています。この配列操作を並行して使えるようにしたいです。肝心なのは、MPI.Allreduce (または別の優れたソリューション) を使用して一緒に追加したい各ノードにカウンターを配置することになったことです。たとえば、カウンターを使用すると、これを行うことができます
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
。私の最善の選択肢は「ユーザー定義操作」ですか、それとも Allreduce にカウンターを追加させる方法はありますか? ありがとう、
編集 (2015 年 7 月 14 日): 辞書のユーザー操作を作成しようとしましたが、いくつかの矛盾がありました。私は次のように書いた
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__'
どうやらそれらが辞書であることを知りたがっているようです。型辞書があることをどのように伝えますか?