榨干CPU,让Houdini速度提升几十倍的神器

榨干CPU,让Houdini速度提升几十倍的神器

Houdini 17.5版本就干了这么一件事——推出PDG。全称为Procedural Dependency Graph,是一个程序化的流程管理工具。

不论是在Houdini软件内部还是外部,PDG都可以发挥强大功力。有些朋友可能觉得PDG离自己很远,或者觉得PDG没啥太大用处,实用性不高。

而PDG的众多优势之一就是任务调度和多线程高效执行。那么PDG到底是如何做到让Houdini效率拥有几十倍提升的?今天给大家演示一个非常简单的场景做示范,我们一起来看。

在传统的Houdini流程中,不论是SOP、DOP还是ROP,由于一些算法的限制和流程上的阻碍,在绝大多数时候Houdini都无法百分之百地利用硬件资源。而空闲的CPU无疑造成了极大的资源浪费,如果我们可以让Houdini时时刻刻跑满CPU,是不是可以节省很大一部分时间?没错,PDG完全可以实现。

举一个极端的例子,remesh节点是一个单线程节点,它的作用是重新拓扑模型布线。来看下方的节点图:

一个球,加一个随时间变化的mountain,然后执行每帧remesh重拓扑,输出20帧缓存。我们把remesh的精度调高到一定值,然后执行rop输出缓存,查看CPU使用率如下:

可以看到8核16线程的CPU,仅仅只占用了一个线程。剩余的15个线程被白白浪费。

而这时就该请出我们的PDG闪亮登场。新建一个TOPnet模块,然后创建ropgeometry节点,并将SOP Path指向刚刚的remesh节点,同样设置1到20帧的输出。

一个只含有一个节点的PDG节点网络就诞生了。接着来到local scheduler设置最大CPU使用率,由于我的ryzen 2700x CPU最大有16个线程,因此这里设置为16(默认设置为0,代表总逻辑核心数/4,若设置为负数,代表总逻辑核心数减去那个数。比如设为-1,最大使用核心数量即为16-1=15):

这样,PDG在执行上述任务的时候,会调度CPU所有的16个逻辑核心,实现榨干CPU从而大大缩短任务执行时间。我们点击Cook Output Node执行:

再来看CPU使用率:

可以看到16个线程全部被利用了,CPU使用率达到了百分之百:

而最终这个任务的执行时间也大大缩短,从没用PDG的几分钟时间,缩短到只需要十几秒!执行效率成几十倍的提升!

奥秘就在于PDG生来就是一个高效的任务执行和调度系统,它可以在明确好流程依赖关系的前提下,充分利用硬件资源。在这个例子中,由于我们输出20帧缓存,而remesh节点只能占用一个线程,使用PDG,就可以利用16个逻辑核心的CPU同时进行16帧的输出,从而榨干CPU。这是一种比较极端的情况,但PDG可以智能分析场景,在一个较为复杂的流程中,在一些无法充分利用硬件资源的场景下,使用PDG,就可以大大提高我们的生产效率!

最后奉上hip工程:

https://pan.baidu.com/s/1iDjU1bfRF78L7ub9MdBDJg