关于DGL消息传递和聚合命令串行或并行执行的问题

问题描述

我的问题是关于在 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 (将#修改为@)