2012-06-03 45 views
5

我正在使用MS Visual Studio中的SSE2指令集。我用它來做一些16位數據的計算。如何有效定義128位常量?

假設我有8個值加載到SSE寄存器中。我想爲它們添加一個常量(例如42)。這是我希望我的代碼看起來的方式。

__m128i values; // 8 values, 16 bits each 
const __m128i my_const_42 = ???; // What should i write here? 
values = _mm_add_epi16(values, my_const_2); // Add 42 to the 8 values 

現在,我該如何定義常量?以下兩種方式有效,但其中一種效率不高,另一種效果不好。

  1. my_const_42 = _mm_set_epi16(42, 42, 42, 42, 42, 42, 42, 42) - 編譯器生成8個命令 「打造」 恆
  2. my_const_42 = {42, 0, 42, 0, 42, 0, 42, 0, 42, 0, 42, 0, 42, 0, 42, 0} - 很難理解到底是怎麼回事;將42改爲例如-42不是微不足道的

有什麼辦法可以更方便地表達128位常量嗎?

+1

也許使用第二種方法的宏也可以 – valdo

回答

8

90%的戰鬥是找到正確的本質。 MSDN Library的組織很好,從this page開始。從那裏,向下鑽取這樣的:

  • 你知道你要使用「MMX,SSE和SSE2內部函數」,點擊該鏈接
  • 你知道你要使用「流式SIMD擴展2」中,單擊鏈接
  • 下一頁吸引力的環節是「整數內存和初始化」既然你不想浮點
  • 你會得到兩個相關的鏈接,加載和設置操作
  • 負載只是讓你你已經發現
  • 的那些

設置爲金色,彈出

2

需要注意在SSE(或NEON)中創建常量。與指令執行相比,從內存加載數據非常緩慢。如果你需要一個可以通過代碼創建的常量,那麼這是更快的選擇。以下是通過代碼創建的常量示例:

xmmTemp = _mm_cmpeq_epi16(xmmA, xmmA); // FFFF 
xmmTemp = _mm_slli_epi16 (mmxTemp, 7); // now it has 0xFF80 (-128) 

xmmTemp = _mm_cmpeq_epi16(xmmA, xmmA); // FFFF 
xmmTemp = _mm_slli_epi16 (mmxTemp, 15); // 0x8000 
xmmTemp = _mm_srli_epi16 (mmxTemp, 11); // 0x10 (positive 16)