如何使用SSE2加载16 x 8位整数

时间:2012-10-10 00:51:12

标签: x86 sse simd sse2

假设我有16个8位整数,并且我想使用SSE2将它们加载到__m128i中:

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

我可以使用_mm_set_epi8静态地执行此操作,但我想动态地执行此操作;值将在运行时决定。

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

我该怎么做?

4 个答案:

答案 0 :(得分:6)

一种方法是使用联合:

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

将值加载到数组a中,然后从v。

中读取SSE向量

或者,如果您的数据已经在连续内存中,那么只需使用_mm_load_si128(或_mm_loadu_si128,如果您不能保证16字节对齐)。

答案 1 :(得分: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);

(我不得不用这个编译器做得很好,但确实有效。)

答案 2 :(得分:1)

我不确定这个问题是否得到了解答,但我确信Paul R是对的。

尝试

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

答案 3 :(得分:0)

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

*((__m128i*)gc)  

*((__m128i*)(&(Strings[i][j])))  
如果您愿意这样做,

也会奏效。我也喜欢结构化答案,但是如果你正在使用指向文本的指针,那么你通常需要进行转换并进行指针数学运算。 (无论如何,那是我的经历。)