1

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

__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

4 回答 4

5

一种方法是使用联合:

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

将您的值加载到数组 a 中,然后从 v 中读取 SSE 向量。

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

于 2012-10-10T01:13:21.763 回答
2

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

对于连续数据,使用负载内在

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

如果您的数据不能保证始终对齐,请使用_mm_loadu_si128.

于 2012-11-16T03:56:47.983 回答
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);

(我必须使用的所有编译器都不能很好地解决这个问题,但它确实有效。)

于 2014-09-14T15:54:52.250 回答
0
char Strings[10][1001];
char *gc="GC";  

*((__m128i*)gc)  

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

如果您愿意这样做,也可以使用。我也喜欢 struct 答案,但如果您使用指向文本的指针,您通常将不得不转换并进行指针数学运算。(无论如何,这都是我的经验。)

于 2012-10-11T16:53:07.843 回答