在TensorFlow中,通常有很多方法可以做到。
例如,要做x+=b
一个人可以assign_add
,或可以add
和assign
还有类似的其他例子,其中2个操作可以完成一个
的工作Concat
+ ExpandDims
vs Stack
scatter_nd_update
多次,与scatter_nd_update
同时单独预先计算您要更新的索引组合。add_n
vs n add
s 单一操作是否从根本上更快/更好? 或者他们是为了方便吗?
使用XLA JIT会改变这个吗?
(动机是定义Julia binding中的重载)
答案 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
可能会略微加快,因为您可以节省堆栈空间,因为调用方法的边际成本非常小。最有可能的是成本可以忽略不计。