问题描述
我的问题是关于在 GPU 上执行来自 DGL 的消息传递和聚合命令的顺序。
我想在具有许多不同边类型的图上使用 GatedGraphConv
模块,并且想知道对于下面的任何给定的 apply_edges()
调用,该调用是否只是在GPU 还是调用会阻塞循环的剩余迭代,直到其计算完成?
这里是 forward()
的 GatedGraphConv
方法的主循环(位于 https://docs.dgl.ai/_modules/dgl/nn/pytorch/conv/gatedgraphconv.html#GatedGraphConv):
for _ in range(self._n_steps):
graph.ndata['h'] = feat
for i in range(self._n_etypes):
eids = th.nonzero(etypes == i,as_tuple=False).view(-1).type(graph.idtype)
if len(eids) > 0:
graph.apply_edges(
lambda edges: {'W_e*h': self.linears[i](edges.src['h'])},eids
)
graph.update_all(fn.copy_e('W_e*h','m'),fn.sum('m','a'))
a = graph.ndata.pop('a') # (N,D)
feat = self.gru(a,feat)
我已经考虑过在单个 GPU 上可能使用一组 cuda 流,其中每个流都会被赋予自己对 apply_edges()
的调用(对于每个不同的边类型,使用不同的字符串 "W_e*h"
,因此它们不要相互冲突)然后在调用 update_all()
之前同步它们,但我突然想到这可能是矫枉过正,也许对 apply_edges()
的调用只是为了安排一个任务GPU,然后 GPU 可以自由地以它认为合适的任何方式完成所有计划的任务(如果可以,包括同时运行多个任务)。
谢谢。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)