我需要在一个__m128i变量的特定位置加载一个连续存储的4个字节,即能够一次执行4个int32_t和,存储所有部分结果。
例如:
const unsigned int SIZE = 2000000;
const unsigned int STEP = 100;
unsigned char* inBuffer = new char[SIZE];
//Fill inBuffer
const unsigned char* a = inBuffer;
int32_t* outBuffer = new int32_t[SIZE/STEP*4];
int32_t* result = outBuffer;
__m128i sum = _mm_setzero_si128 ()
for (int i = 0; i < SIZE; i+=STEP) {
__m128i value = _mm_set_epi32 (a[3],a[2],a[1],a[0]);
sum = __mm_add_epi32(sum,value);
_mm_storeu_si128 ((__m128i*)result,sum);
a+=STEP;
result+=4;
}
//Print outBuffer
delete[] inBuffer;
delete[] outBuffer;
我想知道是否有更有效的方法
答案 0 :(得分:0)
这里的主要问题当然是这一行:
__m128i value = _mm_set_epi32 (a[3],a[2],a[1],a[0]);
然而,一个体面的编译器应该为此生成相当有效的代码。看一下输出(gcc -O3 -S ...
) - 如果它不止一些指令那么你可能要考虑自己进行加载/解包操作。