簡體   English   中英

將最接近的8個頂點插值到Intel CPU上的隨機采樣點時,對稱3d網格的最高效數據布局

[英]Most efficient data layout for a symmetrical 3d mesh when interpolating nearest 8 vertices to random sampled point on Intel CPU

我有一個3d數據的查找表(一個3D RGB查找表),其中我對每個ri,gi,bi(r,g和b不一定均勻間隔)具有預設值f(r,g,b)。 在這種情況下,n對rg和b相同。

r1,r2,....,rn g1,g2,....,gn b1,b2,....,bn

我需要通過在圍繞r,g,b的最近8個頂點的f()值之間進行插值來計算和存儲來自任何輸入(r,g,b)圖像的數百萬個估計的f(r,g,b)值。 連續輸入的r,g,b值是RGB視頻像素,並不是特別可預測的。 對於幾十個值,它們可能相似但不相同,然后迅速變化。 但是,中點附近的R,G,B值通常比極端值更常見。 f()值的表是預先設置的,不會改變-除了f()的采樣間隔之外,我無法對f()進行任何假設,以至於插值頂點是一個合理的估計。 我的目標是使用C ++的高端英特爾CPU。

假設整個表可能很大(幾個MB)並且可能不適合L1或L2高速緩存,那么是否存在一種高速緩存有效的布局,該索引的索引並不是很昂貴,並且可以使8個相鄰頂點在內存中彼此更靠近使緩存丟失的可能性降低? 如果我從多個線程使用同一f()表來提高速度,是否可能會導致性能下降?

我的第一個想法是使用簡單的線性C數組並為其計算索引-ftable [r + n (g + n b)]

一種替代方法是將C樣式3d數組與它們的多個查找一起使用-ftable [r] [g] [b],但考慮到兩個加法和乘索引的相對便宜性以及查找和查找的開銷,它的性能似乎較差。潛在的L1 / L2緩存未命中。 或者,是否有一種布局C樣式3D數組的狡猾方法,可以提高緩存命中率,以查找基本隨機輸入值的8個相鄰頂點?

我不知道這是否是最有效的方法,但是KD-Tree可以非常有效地解決您的問題。

https://zh.wikipedia.org/wiki/K-d_tree

它易於實現,並且針對此類問題而設計。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM