当使用SSE2内部函数进行逐位操作时,必须将指针从int*
转换为__m128i*
。此代码是否会破坏严格的别名规则?
void bit_twiddling_func(int size, int const* input, int* output) {
const __m128* x = (const __m128*)input;
const __m128* y = (const __m128*)output;
for (int i=0; i < size/4; ++i, ++x, ++y) {
__m128i x4 = _mm_load_si128(x); // load 4 integers
// do some bit twiddling
_mm_store_si128(y, x4); // store 4 integers
}
}
谢谢!
答案 0 :(得分:2)
是;它打破了严格的别名规则。两种不同的类型不能指向内存中的相同位置。这里有x指向输入,y指向输出,但它们的类型不同。
您可以更改函数的签名以获取__m128 *参数,但最简单的方法就是保留它。如果你小心输入/输出参数指向具有正确对齐和大小约束的内存(即它们应该指向你的循环没有索引到结尾或加载未初始化数据的东西)它可能会工作得很好。)