欢迎光临散文网 会员登陆 & 注册

[Houdini] Compiled Sops

2022-06-02 23:16 作者:pandahgt  | 我要投稿

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

Complied bolcks

一般来说,普通的节点链,每个节点本身都会保存一份几何体,这样我们切换节点时,会很快的展示出来,当然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进行优化。

NOTE


[Houdini] Compiled Sops的评论 (共 条)

分享到微博请遵守国家法律