使用单个操作比使用多个操作更好吗?

时间:2017-05-21 04:41:51

标签: optimization tensorflow

在TensorFlow中,通常有很多方法可以做到。

例如,要做x+=b 一个人可以assign_add可以addassign

还有类似的其他例子,其中2个操作可以完成一个

的工作
  • Concat + ExpandDims vs Stack
  • scatter_nd_update多次,与scatter_nd_update同时单独预先计算您要更新的索引组合。
  • add_n vs n add s

单一操作是否从根本上更快/更好? 或者他们是为了方便吗?

使用XLA JIT会改变这个吗?

(动机是定义Julia binding中的重载)

2 个答案:

答案 0 :(得分:1)

在TensorFlow中,通常单个操作(如果可用)更有效。 x = x + b经常为x + b分配内存,然后释放它,而x += b没有开销。类似地,对于张量流中的许多融合内核,例如softmax损失的内核。

我们希望最终XLA能够达到直接代码与最小化内核的代码一样高效的程度,但截至2017年5月情况并非如此。

答案 1 :(得分:0)

实际上很难说哪个在操作上更有效率。

其中一个更好的例子......

a = a + b vs a += b

如果给定语言是用汇编代码IE mips编写的。 mips的add函数通常是

add save_ref, value_ref1, value_ref2

因此编译器会将给定的操作写为

add a, a, b  **or** add a, b, a

是完全相同的。要弄清楚TF中哪个操作更有效,你要么必须查看文档或源代码,并希望它详细说明O(n)次。

调用单个scatter_nd_update可能会略微加快,因为您可以节省堆栈空间,因为调用方法的边际成本非常小。最有可能的是成本可以忽略不计。