2012-06-22 49 views

回答

7

存在_mm_shl_epi32()的內在性,正是如此。

http://msdn.microsoft.com/en-us/library/gg445138.aspx

但是,它需要XOP instruction set。只有AMD Bulldozer和Interlagos處理器或更高版本才具有此指令。它不適用於任何英特爾處理器。

如果你想不做XOP指令,你需要做到這一點:把它們拉出來,一個接一個地做。

沒有XOP指令,可以使用以下內在與SSE4.1做到這一點:

  • _mm_insert_epi32()
  • _mm_extract_epi32()

http://software.intel.com/sites/products/documentation/studio/composer/en-us/2011/compiler_c/intref_cls/common/intref_sse41_reg_ins_ext.htm

那些會讓你提取部分一個128位寄存器放入常規寄存器中進行移位並放回原位。

如果使用後一種方法,它會非常低效。這就是爲什麼_mm_shl_epi32()首先存在。

2

沒有XOP,您的選擇是有限的。如果您可以控制移位計數參數的格式,則可以使用_mm_mullo_pi16,因爲乘以2的冪與通過該功率移位相同。例如,如果要將您的8位16位元素置於SSE寄存器中<0, 1, 2, 3, 4, 5, 6, 7>,則可以將乘以2乘以移位計數功率,即<0, 2, 4, 8, 16, 32, 64, 128>

+0

謝謝,我已經管理它_mm_mullo_epi32(SSE4.1)。嗯...,可能會有更好的方式爲英特爾CPU嗎? – user1468756

0

在某些情況下,這可以替代_mm_shl_epi32(a, b)

_mm_mullo_ps(a, 1 << b); 

一般來說,這需要b有一個恆定的值 - 我不知道的一個有效的方式使用舊的SSE指令來計算(1 << b)