[Houdini] Compiled Sops
Copiled Sops对block内的节点进行编译,使这些节点计算的更快。

一般来说,普通的节点链,每个节点本身都会保存一份几何体,这样我们切换节点时,会很快的展示出来,当然sidefx在这方面做了很多优化,它并不完全是这样工作。Coplied Sops做的是把节点链合并成一个节点,把他们变成一个整体,做最主要的工作,而不是突然有领导来检查进度。当我们切换blocks内的节点显示时,虽然也能显示,但是Compiled Sops这时是没有作用的。
它还可以使for循环模块多线程运行,这对程序化建模有很大的帮助。
这个模块也有一些限制。有些节点不支持编译,可以在节点网络按d打开显示不能编译的节点图标(下图),不能编译的节点旁会有一个打叉的齿轮。自houdini16加入Compiled Sops以来,sidefx一直在根据用户需求重新编写使节点可编译,不得不说现在找到一个不能编译的节点很难。

不能使用本地表达式,比如$CEX之类。不能通过名称引用其他节点的数据,比如npoints("/obj/sphere1"),引用的话要用到spare input,通过-1端口引用。不能引用上游节点,比如用point(0, …)引用第一个连接的节点数据,需要的话仍然要用spare input。引用模块外的节点能正常工作,不过会影响性能。外部引用模块内的节点数据时也能工作,这时性能和没有经过编译一样。编译过的For each不支持Stop Condition。
概述(以下来源于帮助文档)
在节点网络中,您可以节点的一部分放入Complied blocks中(如果里面的所有节点都是“可编译的”)。在某种程度上,这使得它们像是一个节点一样。
要使编译模块正常工作,有些节点功能不能使用,但在适当的情况下可能会带来巨大的好处。
主要好处是多线程for-each 循环,其中网络在大量单独的部分上运行相同的节点块。编译块让 Houdini 将这些迭代分布在多个内核上。
另一个好处是更有效地使用 OpenCL。通常,即使一个节点处理图形卡上的几何图形,也必须在每个节点之后将几何图形复制回主内存,因为任何其他节点都可能尝试访问它。然而,在一个编译块中,多个基于 OpenCL 的节点可以在处理数据时将数据保留在显卡上,而无需将其复制回来,从而提高了速度。
在普通网络中,理论上每个节点都会复制它正在处理的几何图形。有很多优化可以在实践中提高效率,但它仍然是有代价的。在已编译的块中,节点可以在相同的几何图形上就地工作,因为不允许外部参考。这可以为编译块提供额外的加速。
如何编译For Loop
Compiled SOPS|H16 Masterclass里有几个例子(https://www.sidefx.com/tutorials/houdini-16-masterclass-compiled-sops/),有简单的也有复杂的。
帮助文档也有解释


对于这些我觉得比较容易记忆的方式:把For Loop模块或者Compile模块看作一个国家,里面的节点看作人民,他们不会说外语,foreach begin和foreach end看作外交官,会说外语,当人民直接和外界联系时就会有错误(上图的错误示范,merge3不会说外语却直接和copile begin联系),这时需要一个foreach begin改成fetch input模式,merge通过它和外界联系才可以。
最后,官方不建议把尽量使用编译模块提高性能放在第一位。编译模块提高性能最明显的地方是大量piece迭代处理操作(指的是foreach loop?)。最好是先按正常流程完成大致工作,再用Compile SOPs进行优化。
