2012-10-10 86 views
1
裝入16×8位整數

假設我有16個8位整數,我想將它們裝入使用SSE2作爲__m128i:靜態使用_mm_set_epi8如何使用SSE2

__m128i v = _mm_set_epi8(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); 

我能做到這一點,但我想動態地做到這一點;這些值將在運行時決定。

C = userinput; 
for(int i=0; i<16; i++) 
{ 
    load C*i on v at position i 
} 

我該怎麼做?

+0

對於像你所描述的情況,但是使用16位整數的情況下,使用一個像你現在正在做的常量('set(1,2,3, 4,...)'),然後乘以'SET1(USER_INPUT)'。廣播很容易/便宜,但沒有指示在一個註冊表中製作一個系列。在大多數編譯器中,'_mm_set_epi8(C * 1,C * 2,...)'會編譯成許多標量乘。 –

回答

6

一種方法是使用工會:

union { 
    __m128i v; 
    uint8_t a[sizeof(__m128i)]; 
} u; 

裝入值到數組,然後從v讀上證所矢量回

或者,如果您的數據已經是連續內存然後就使用_mm_load_si128(如果不能保證16字節對齊,則使用_mm_loadu_si128)。

+1

也許你可以用uint8_t a [sizeof(__ m128i)];''替換'uint8_t a [16];' –

+1

當然 - 爲什麼不 - 更新回答。 –

0
char Strings[10][1001]; 
char *gc="GC"; 

*((__m128i*)gc) 

*((__m128i*)(&(Strings[i][j]))) 

也將工作,如果你寧願這樣做的。我也喜歡結構化的答案,但是如果你正在處理指向文本的指針,你通常必須進行演員指針數學計算。 (無論如何,這是我的經驗。)

1

我不確定這個問題是否已被回答,但我確信Paul R是正確的。

嘗試

__m128i v = _mm_load_sil128((__m128i*)&C[0]); 
2

傳遞給_mm_set_epi8值不必是常量 - 在你的榜樣,你可以非常清楚寫

__m128i v = _mm_set_epi8( 0, C, 2*C, 3*C, 
          4*C, 5*C, 6*C, 7*C, 
          8*C, 9*C, 10*C, 11*C, 
         12*C, 13*C, 14*C, 15*C); 

(我不得不手工編譯器的無但是它確實有效)