添加使用malloc()并具有状态的TensorFlow Op

时间:2017-03-02 19:45:10

标签: c++ tensorflow

我编写了一个TensorFlow Op,它包装了一个用C语言编写的库,它在内部调用malloc()来分配缓冲区并保持状态。我在构造函数中初始化库,这是malloc()调用发生的地方,然后在Compute()中我使用它与互斥锁。析构函数对free()进行适当的调用。

在我的模型中,每个线程都在同一个图中创建一个Op的副本,并在共享会话中运行它。代码经常与指针相关的问题崩溃,例如"释放对象的错误校验和 - 对象可能在被释放后被修改"。我为Op编写的单元测试,只需一个线程,工作正常。

我怀疑图优化器可能正在重新使用Op的单个实例,或类似的东西。有没有办法告诉它Op是有状态的,它应该保持原样?是否有其他可能的原因导致崩溃?

我在OSX 10.10下运行TensorFlow 1.0.0并使用clang 7.0编译Op。我首先将C文件编译为共享对象,然后将C ++文件与共享对象一起编译。

1 个答案:

答案 0 :(得分:0)

根据“添加新操作”中的documentation

  

重要提示:您的OpKernel实例可以同时访问。您的Compute方法必须是线程安全的。使用互斥量保护对类成员的任何访问。或者更好的是,不要通过班级成员共享状态!考虑使用ResourceMgr来跟踪操作状态。

不幸的是,截至撰写此答案时,ResourceMgr的使用还是很粗略的。