簡體   English   中英

3D向量的SSE對齊

[英]SSE alignment of 3D vector

我希望確保將SSE用於3D(96位)浮點矢量的算術運算。 但是,我已經讀到了關於必要內容的相互矛盾的觀點。

有些文章/帖子說我需要使用4D向量並“忽略”第4個元素,有些說我必須用__declspec(align(16))類的東西裝飾我的類,並重寫new運算符,還有一些說編譯器很聰明足以為我調整事物(我真的希望這是事實!)。

我正在使用Eigen庫,但發現“不受支持的” AlignedVector3類不適合用於此目的(例如,按組件划分時被零錯誤除, lpNorm函數包括第4個虛擬元素)。

我讀過的很多文章都已經有好幾年了,因此我希望現代的編譯器/ SSE版本/ CPU可以為我對齊數據,或者使用非16字節對齊的數據。 任何對此的最新知識將不勝感激!

實際上,我們在工作中使用SIMD,也許我可以就此提供您的反饋。 對齊是處理SIMD時必須注意的事項,這是為了確保高速緩存行對齊。 但是我不確定如果它不對齊或者CPU是否仍然能夠管理它是否仍然會導致崩潰(例如,以前不對齊的標量類型,它導致了崩潰,現在CPU處理了它,但是它減慢了速度)表演)。 也許您可以在這里查看SSE,內在函數和對齊方式對於該問題的對齊方式部分似乎有很好的答案。

實際上,即使實際上它是4D矢量,您也將其用作3D矢量,但這並不是一個很好的做法,因為您不會從SIMD指令的全部性能中受益。 匹配的最佳方法是使用數組結構(SOA)。

注意:我假設將128位SIMD寄存器映射到4個標量類型(整數或浮點)

例如,如果您有4個3D點(或矢量),則按照自己的方式,將有4個4D矢量,而忽略每個點的第4個分量。 總共您將獲得4 * 4個值。

通過使用SOA,您將擁有3個SIMD 128位(12個值)寄存器,並且將通過以下方式存儲點。 SIMD

  • r1:xxxx
  • r2:yyyy
  • r3:zzzz

這樣,您可以填充整個SIMD寄存器,從而最大程度地利用SIMD的優勢。 另一件事是,您將必須進行的許多計算(例如,將2組4個向量相加)僅需要3條SIMD指令。 使用和理解它有些棘手,但是當您這樣做時,收獲是巨大的。

當然,您將無法在所有情況下都使用這種方式,因此您將退回到忽略最后一個值的原始解決方案。

暫無
暫無

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

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