2012-02-05 56 views
1

答案似乎是否定的,因爲raymarching是高度條件的,即每條光線都遵循唯一的執行路徑,因爲在每一步我們都會檢查不透明度,終止等,這將根據單個光線的方向而變化。在SIMD架構下可以加速raymarching?

因此,似乎SIMD很大程度上無法加速這一點;相反,加速需要MIMD。

這是否有意義?或者我錯過了什麼?

回答

1

如前所述,你很可能使用SSE指令實現您 矢量數學得到了加速(注意影響討論 here - 也爲其他的方法)。這種方法將使代碼 保持簡潔和可維護性。

我承擔,但是,你的問題是關於「包穿越」(或東西 喜歡它),換句話說處理多個標量值每一個 不同的射線:

原則上應該是可能的推遲陰影到另一個通行證。 一旦裸行進 通過終止並且臨時結果作爲輸入存儲爲陰影 通過,則可以用新射線重新填充SIMD分組。這將允許並行化您的代碼的某個特定案例相關百分比 ,以顯示所有四個SIMD通道。 爲了避免高速緩存壓力(除非您的幾何體嚴格爲程序性),平鋪圖像並將其中的射線編入Morton-order可能是一個好主意。

除非您嘗試,否則您不知道它是否有回報。我的猜測是,如果它 確實如此,那麼加速的數量可能並不值得代碼 在四條車道上的複雜性。

您是否考慮過使用SIMT架構,如可編程GPU? 最新的可編程圖形卡允許您以交互式速率執行 raymarching(查看它發生在您的瀏覽器here)。

+0

只需[添加到您的答案](http://www.yosefk.com/blog/simd-simt-smt- parallelism-in-nvidia-gpus.html)爲其他誰不確定SIMT和SIMD之間的差異。 – 2012-09-02 11:42:41

1

最後幾天我爲一塊海綿做了一個基於軟件的raymarcher。目前沒有使用SIMD,我也沒有使用特殊的算法。我只在X和Y的-1和1之間追蹤,這是目標紋理的U和V.然後我得到了一個相機位置和一個目的地,我用它來計算raymarch的增量矢量。

之後,我使用恆定的迭代值執行,其中只有一個分支決定是否與分形體積有交集。所以如果我的相機眼睛是E,我的方向矢量是D,我必須找到最小的t。如果我發現或達到了最大距離,我會打破循環。最後我有 - 從計算片段顏色。

在我看來,應該可以通過SSE1/2來並行化這些操作,因爲可以通過將矢量中的字段置零(__m64/__m128)來解決分支問題,所以進一步的SIMD操作將不適用於此處。這實際上取決於你的raymarch/-cast,但如果你只是從一個函數中計算片段顏色(就像我的分形曲線一樣),而不是非線性地訪問內存,有一些技巧可以使它成爲可能。

當然,這個答案包含猜測,但是當我並行化這個例程時,我會通知你。

+0

謝謝,是的,如果/當你這樣做的時候,請在這裏放一張紙條... – 2012-05-18 11:26:39