SSE優化引擎

2021-06-09 01:06:02 字數 1388 閱讀 7845

週末在家嘗試著使用sse對引擎進行優化。

關於如何使用sse這裡並不多說,有很多資料,這裡提一下,使用sse無非就是直接使用彙編或是使用函式指令,如果是諸如解碼器核心之類的推薦使用彙編直接進行優化,畢竟可以將核心全部用彙編實現,其他情況下使用sse函式指令即可。

接下來說一下sse在3d引擎中的優化。可優化的地方很多,但總的來說絕大部分優化都集中在了數**算,3d遊戲的數**算基本上都是向量運算非常適合進行sse優化,一般情況下把數學模組優化好也基本上就夠了。

在我進行優化過程中發現效率並沒有提公升,甚至反而下降。經過分析和實踐發現了問題,而且這個問題是乙個深層次的設計問題。一般情況下我們很可能在開始寫引擎些數學模組的時候並沒有考慮用sse進行優化,至少已開始沒有考慮。在後來進行sse優化的時候出了運算本身我們還要把向量(或者變數)轉換為__m128這個資料型別上,在進行運算。其實運算本身是快的,但是把原有變數轉換到__m128上是很耗時的,這樣導致了使用sse優化的結果反而不如不優化之前。很自然我們會想能不能不進行轉換,至少不掉用_mm_load_ps之類的函式進行轉換,直接把指標給過去如__m128 *pdata = (__m128 *)(&vector);,這樣做想得很好,但是不可行。原因很簡單sse要求資料必須是16位元組對齊,否則運算時會當機。

之所以說這是乙個在引擎設計上的深層次問題,是因為解決這個問題要從三個方面入手:

1. 所有要參與sse運算的資料型別必須是16位元組對齊的,不管是vector3還是vector2,也就是說它們的大小和vector4是一樣的,這個如果不是在最開始就考慮好,很可能已經寫了大量**,後來要進行改動。具體而言向網格,骨骼等都是建立在這些基本資料結構上的,可能會帶來一些改動。

2. 記憶體的分配釋放需要自己進行改寫或者過載,16位元組對齊不僅指的是資料結構本身也是他的位址要16位元組對齊。但我們呼叫的malloc這樣的函式都是4位元組對齊,這需要改寫。

3. 資料的記憶體分布,尤其是矩陣這樣的。一般來說矩陣就是乙個float[16],對於cpu而言合適的排列並不一定是和sse,如下

(*vecout)[0] = (*vecin)[0]*(*mtxin)[_00] + (*vecin)[1]*(*mtxin)[_10] + (*vecin)[2]*(*mtxin)[_20];

(*vecout)[1] = (*vecin)[0]*(*mtxin)[_01] + (*vecin)[1]*(*mtxin)[_11] + (*vecin)[2]*(*mtxin)[_21];

(*vecout)[2] = (*vecin)[0]*(*mtxin)[_02] + (*vecin)[1]*(*mtxin)[_12] + (*vecin)[2]*(*mtxin)[_22];

很顯然如果用cpu進行運算的時候如果_00,_10,_20這些都是連續的那會顯出提高cache的效率,但是要是用sse則_00,_01,_02連續效率才高,這也是事先要考慮好的地方

mysql 引擎優化

mysql數 據庫引擎取決於mysql在安裝的時候是如何被編譯的。要新增乙個新的引擎,就必須重新編譯mysql。在預設情況下,mysql支援三個引擎 isam myisam和heap。另外兩種型別innodb和berkley bdb 也常常可以使用。如果技術高超,還可以使用mysql api自己做乙...

SSE技術簡介

sse技術簡介 intel公司的單指令多資料流式擴充套件 sse,streaming simd extensions 技術能夠有效增強cpu浮點運算的能力。visual studio net 2003提供了對sse指令集的程式設計支援,從而允許使用者在c 中不用編寫彙編 就可直接使用sse指令的功能...

載入操作 SSE

記憶體和初始化載入操作 mm load ss 載入低值並清除三個最大值 mm loadu ps和 mm storeu ps,不要求位元組對齊 float op1 4 float op2 4 float result 4 載入 m128 a mm loadu ps op1 m128 b mm load...