【发布时间】:2013-10-24 16:36:10
【问题描述】:
我想要一个 __m128i 变量, 并做一些这样的操作:
unsigned char* myArray;
__m128i fourValues;
//Do some strange reference assignment, e.g.:
//int32_t& a = *((int32_t*) &fourValues);
//int32_t& b = *(((int32_t*) &fourValues) + 1);
//int32_t& c = *(((int32_t*) &fourValues) + 2);
//int32_t& d = *(((int32_t*) &fourValues) + 3);
for (int i =0; i < someSize; i+=4) {
a = d + myArray[i];
b = a + myArray[i+1];
c = b + myArray[i+2];
d = c + myArray[i+3];
//Do something with fourValues;
}
其中 a,b,c,d 是(或表现为)int32_t 变量,并且是fourValues 的第一个、第二个、第三个和第四个32 位。这可能吗?
【问题讨论】:
-
使用显式加载和存储操作。这样,您的
__m128i变量实际上将存在于 SSE 寄存器中,这是最有效的。还要寻找使用 SSE 指令进行操作的方法,这样您就不需要加载和存储......但是单个加载/存储对比别名更有效。 -
注意:如果您为此发布当前的 实际 标量代码,那么您可能会使用 SSE 获得更具体的解决方案。