了解OpKernel :: Compute以及tensorflow如何设置GPU执行

时间:2017-01-26 11:11:35

标签: tensorflow

我在理解TF内部时遇到了问题(或者更确切地说是放慢了进度)。在过去的三天里,我一直在挖掘代码(来自"顶部",下降)。我已经掌握了图形创建和大多数在调用OpKernel :: Compute之前发生的事情。只是一个快速摘要(如果我有重要的错误,请纠正我):

  1. 无论何处
  2. 定义图表
  3. 调用DirectSession :: Run() 内部:
  4. 图表得到处理(拆分/优化/等等......)
  5. 为每个子图创建执行程序
  6. 创建RunState
  7. 输入在Rendevouz
  8. 中发送(/存储)
  9. 所有执行者的执行者:: RunAsync()
  10. 有:

    1. FillContextMap为所有节点分配上下文
    2. Process(TaggedNode,..)函数被调度到所有根节点的ThreadPool
    3. 有:

      1. 准备输入张量和参数(并创建OpKernel和OpContext)
      2. 设备::计算(内核,上下文,...)被调用(同步或异步)
      3. Device :: Compute真的只是从我所见过的
      4. 中调用OpKernel :: Compute

        所以问题部分在于我不知道如何(高效地)了解其余的代码,而且大多数情况下我无法理解OpKernel如何在GPU上调度实例以及何时。在检查TF之前,我读了关于GPGPU(openCL文档)的内容,我想我得到了它的要点 - 工作项,组,计算队列,同步,内存管理,物理设备上的内存类型。但我似乎无法将这些知识映射到TF如何使用GPU。正如我所说 - 我到达了OpKernel :: Compute并且(在几种类型的内核中)我看到只有内存分配,在某些情况下(matmul)CUBlass被调用(所以我无法看到发生了什么) ),或者没有GPU实现。我希望看到一些机制,根据图的分析,设置一些同步点等等,为内核分配可变数量的线程(工作项)。  我非常感谢有关上述主题的任何澄清。

1 个答案:

答案 0 :(得分:3)

再过一天,我想我明白了:

  1. Device :: Compute,当设备是GPU设备时,具有不同的实现:它检查输入是否在与该节点的on不同的上下文中(如果它们&#等待它们通过事件挂钩完成) 39;再没有)
  2. 然后更改当前流(我认为是CUDA的全局流)和
  3. 调用OpKernel :: Compute方法,如果有任何要执行的内核,它实际上在流上排队(相当于OpenCL中的命令队列)。
相关问题