SSE指令的使用學習

2021-09-30 13:27:24 字數 1947 閱讀 5893

1. 什麼是指令集?

指令集是為了增強cpu在某些方面(如多**)的功能而特意開發出的一組程式**集合。

2.常見的指令集有哪些呢?

1)mmx(multi-media extensions,做**擴充套件)指令集:intel2023年推出的一項多**指令增強技術。共包含57條多**指令,這些指令一次可以處理多個資料。

注意:sse指令和3dnow!指令彼此互不相容,但sse包含了3dnow!的絕大多數功能。

3)sse2、sse3、sse4是sse的擴充套件技術。

4)3dnow!指令集。

3.visual studio使用sse需要新增對應的標頭檔案:

原因:加入標頭檔案可以將彙編形式的指令集封裝成c語言形式,可增強可讀性以及可維護性。

mmintrin.h------>mmx

xmmintrin.h------>sse

emmintrin.h------>sse2

pmmintrin.h------>sse3

有了這些標頭檔案的支援,在我們的**中便可以呼叫指令集函式的程式。

但是這些函式必須獲得硬體cpu的支援,我們如何才能確保我們的計算機可以呼叫這些指令集呢?

可以使用乙個叫做cpu-z的工具自己對你的cpu的各種引數進行查詢:

所謂cpu-z是一款cpu檢測軟體,包括檢測cpu的處理器、記憶體、顯示卡等等,(挺好用的!)

其介面如下,大致功能也可以一目了然:

4.載入了標頭檔案便可使用sse的指令了,那麼sse指令和資料有什麼特點呢?

sse指令的函式名稱一般定義為:_m_operation() ;

sse的資料型別:__m128

ps:需要注意因為sse的資料型別的固有特點,所以sse指令要求資料的位址是16位元組對齊的,怎麼把我們給定的資料轉化成該型別,需要使用_mm_load_ps(float const * _a)加以實現,該函式的原型:extern __m128 _mm_load_ps(float const * _a)

通俗的理解,該函式實現了將float的陣列的每四個元素進行組合作為__m128型別的資料返回,以實現sse指令函式的資料要求。

在使用該函式時:輸入資料_a應該先被指定為16位元組對齊,實現方法:

__declspec(align(16)) float  input[4]=

在處理完資料以後,用sse指令完成的資料一般儲存在以__m128的形式儲存在暫存器裡,為了後續運算一般需要將其儲存會float形式的記憶體中,此時需要用到函式:

void _mm_storeu_ps(float* p,__m128 a);

乙個例子很好的詮釋以上知識點:

5.怎麼知道sse有哪些可用的函式呢?

開啟標頭檔案「xmmintrin.h」,通過命名很容易推測出函式的應用目的。

參考:1) 

2) 3)

4)

SSE指令學習 mm shuffle

mm setr epi8 integer,sets中的函式,初始化賦值。mm shuffle epi8 第乙個引數為輸入陣列 第二個引數為掩模,對應輸入陣列的第幾個值。功能 對資料進行重組,非常靈活。當掩模值大於1時,該值除以16求餘,如17即為1。當掩模值為 1時對應值為0。m128i a mm ...

SSE指令學習 四大儲存指令

1 mm store si128 m128i p,m128i a 指令名 void mm store si128 m128i p,m128i a 功能 可儲存128位資料 說明 將 m128i 變數a的值儲存到p所指定的變數中去 2 mm storel epi64 m128i a m128i b 指...

SSE的指令系統

sse的指令系統 sse2和sse的指令系統非常相似,僅僅多了少量額外的浮點運算,64位浮點 整數運算支援 sse比傳統浮點運算要快,因為它使用128位儲存單元。在windows使用 include 在linux下使用 include 1.變數定義和使用 m128 s1 s1.m128 f32 2 ...