[Houdini] Compiled Sops
Copiled Sops對(duì)block內(nèi)的節(jié)點(diǎn)進(jìn)行編譯,使這些節(jié)點(diǎn)計(jì)算的更快。

一般來說,普通的節(jié)點(diǎn)鏈,每個(gè)節(jié)點(diǎn)本身都會(huì)保存一份幾何體,這樣我們切換節(jié)點(diǎn)時(shí),會(huì)很快的展示出來,當(dāng)然sidefx在這方面做了很多優(yōu)化,它并不完全是這樣工作。Coplied Sops做的是把節(jié)點(diǎn)鏈合并成一個(gè)節(jié)點(diǎn),把他們變成一個(gè)整體,做最主要的工作,而不是突然有領(lǐng)導(dǎo)來檢查進(jìn)度。當(dāng)我們切換blocks內(nèi)的節(jié)點(diǎn)顯示時(shí),雖然也能顯示,但是Compiled Sops這時(shí)是沒有作用的。
它還可以使for循環(huán)模塊多線程運(yùn)行,這對(duì)程序化建模有很大的幫助。
這個(gè)模塊也有一些限制。有些節(jié)點(diǎn)不支持編譯,可以在節(jié)點(diǎn)網(wǎng)絡(luò)按d打開顯示不能編譯的節(jié)點(diǎn)圖標(biāo)(下圖),不能編譯的節(jié)點(diǎn)旁會(huì)有一個(gè)打叉的齒輪。自houdini16加入Compiled Sops以來,sidefx一直在根據(jù)用戶需求重新編寫使節(jié)點(diǎn)可編譯,不得不說現(xiàn)在找到一個(gè)不能編譯的節(jié)點(diǎn)很難。

不能使用本地表達(dá)式,比如$CEX之類。不能通過名稱引用其他節(jié)點(diǎn)的數(shù)據(jù),比如npoints("/obj/sphere1"),引用的話要用到spare input,通過-1端口引用。不能引用上游節(jié)點(diǎn),比如用point(0, …)引用第一個(gè)連接的節(jié)點(diǎn)數(shù)據(jù),需要的話仍然要用spare input。引用模塊外的節(jié)點(diǎn)能正常工作,不過會(huì)影響性能。外部引用模塊內(nèi)的節(jié)點(diǎn)數(shù)據(jù)時(shí)也能工作,這時(shí)性能和沒有經(jīng)過編譯一樣。編譯過的For each不支持Stop Condition。
概述(以下來源于幫助文檔)
在節(jié)點(diǎn)網(wǎng)絡(luò)中,您可以節(jié)點(diǎn)的一部分放入Complied blocks中(如果里面的所有節(jié)點(diǎn)都是“可編譯的”)。在某種程度上,這使得它們像是一個(gè)節(jié)點(diǎn)一樣。
要使編譯模塊正常工作,有些節(jié)點(diǎn)功能不能使用,但在適當(dāng)?shù)那闆r下可能會(huì)帶來巨大的好處。
主要好處是多線程for-each 循環(huán),其中網(wǎng)絡(luò)在大量單獨(dú)的部分上運(yùn)行相同的節(jié)點(diǎn)塊。編譯塊讓 Houdini 將這些迭代分布在多個(gè)內(nèi)核上。
另一個(gè)好處是更有效地使用 OpenCL。通常,即使一個(gè)節(jié)點(diǎn)處理圖形卡上的幾何圖形,也必須在每個(gè)節(jié)點(diǎn)之后將幾何圖形復(fù)制回主內(nèi)存,因?yàn)槿魏纹渌?jié)點(diǎn)都可能嘗試訪問它。然而,在一個(gè)編譯塊中,多個(gè)基于 OpenCL 的節(jié)點(diǎn)可以在處理數(shù)據(jù)時(shí)將數(shù)據(jù)保留在顯卡上,而無需將其復(fù)制回來,從而提高了速度。
在普通網(wǎng)絡(luò)中,理論上每個(gè)節(jié)點(diǎn)都會(huì)復(fù)制它正在處理的幾何圖形。有很多優(yōu)化可以在實(shí)踐中提高效率,但它仍然是有代價(jià)的。在已編譯的塊中,節(jié)點(diǎn)可以在相同的幾何圖形上就地工作,因?yàn)椴辉试S外部參考。這可以為編譯塊提供額外的加速。
如何編譯For Loop
Compiled SOPS|H16 Masterclass里有幾個(gè)例子(https://www.sidefx.com/tutorials/houdini-16-masterclass-compiled-sops/),有簡單的也有復(fù)雜的。
幫助文檔也有解釋


對(duì)于這些我覺得比較容易記憶的方式:把For Loop模塊或者Compile模塊看作一個(gè)國家,里面的節(jié)點(diǎn)看作人民,他們不會(huì)說外語,foreach begin和foreach end看作外交官,會(huì)說外語,當(dāng)人民直接和外界聯(lián)系時(shí)就會(huì)有錯(cuò)誤(上圖的錯(cuò)誤示范,merge3不會(huì)說外語卻直接和copile begin聯(lián)系),這時(shí)需要一個(gè)foreach begin改成fetch input模式,merge通過它和外界聯(lián)系才可以。
最后,官方不建議把盡量使用編譯模塊提高性能放在第一位。編譯模塊提高性能最明顯的地方是大量piece迭代處理操作(指的是foreach loop?)。最好是先按正常流程完成大致工作,再用Compile SOPs進(jìn)行優(yōu)化。
