第一遍(1M射線),無符號的字符陣列(或甚至壓縮單位)
ray 0 ------------------ render end --------------> 0 \
ray 1 ------------------ surface ---------------> 1 \
ray 2 ------------------ surface ---------------> 1 }-- bad for SIMD
ray 3 ------------------ render end --------------> 0 /
ray 4 ------------------ surface ---------------> 1 /
...
...
ray 1M ...
分選(高速緩存或復此重複使用折射和反射)與表面類型 (存在/不存在的)和表面位置(時間一致性)
ray 1 \
ray 2 -------------------- all surfaces --------------> 1 good for simd
ray 4/
ray 0 \
ray x -------------------- all render end ------------> 0 good for simd
ray 3/
second pass (refraction) (1M rays)
ray 1 ..................... refract ...................> cast a new ray
ray 2 ..................... refract ...................> cast a new ray
ray 4 ..................... refract ...................> cast a new ray
ray 0 .................... no new ray casting .........> offload some other work/draw
ray x .................... no new ray casting .........> offload some other work/draw
ray 3 .................... no new ray casting .........> offload some other work/draw
third pass (reflection) (1M rays)
ray 1 ..................... reflect...................> cast a new ray
ray 2 ..................... reflect...................> cast a new ray
ray 4 ..................... reflect...................> cast a new ray
ray 0 .................... no new ray casting .........> offload some other work/draw
ray x .................... no new ray casting .........> offload some other work/draw
ray 3 .................... no new ray casting .........> offload some other work/draw
現在有兩組1M射線,每次迭代時加倍。所以如果你有256M元素的空間,你應該能夠投射光線,直到深度7或8.所有這些都可以通過適當的索引在單個陣列上完成。
而不是分支,將數組元素中的「1」保存爲「要分支」(「0」表示不分支)並對數組進行排序,使得所有分支彼此相鄰,無分支「 0「是彼此相鄰的,所以SIMD得到了它想要的和更快的,因爲所有元素在多遍(迭代)中做同樣的事情(只有分支或只有非分支)而不是假遞歸性(以性能指數方式殺死性能)。單個基數排序通行證可以做到這一點。我的意思是,在第二遍中,內核尋找「1」來分支並繼續追蹤光束,「0」結束並獲得像素的顏色。 – 2014-10-04 11:19:27
我還是有點困惑。首先,當你說使用「多次傳遞」時,你的意思是不同的內核調用?在哪裏進行射線分類,在內核或主機上進行?如果它在主機上,會不會導致性能下降?在任何情況下仍然不確定整個控制流程。就像你說的在內核1中有一道光線緩衝區,追蹤它們直到它們碰到某物,然後根據它們擊中的位置,再次追蹤等將它們分成內核2和3? – user1855952 2014-10-04 20:04:03