2

当使用 SSE2 内部函数进行按位操作时,必须将指针从int*to 转换为__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
    }
}

谢谢!

4

1 回答 1

2

是的; 它打破了严格的别名规则。两种不同的类型不能指向内存中的同一个位置。这里有 x 指向输入和 y 指向输出,但它们的类型不同。

您可以更改函数的签名以采用 __m128* 参数,但保留它可能是最简单的。如果您小心输入/输出参数指向具有正确对齐和大小约束的内存(即它们每个都应该指向您的循环不索引结束或加载未初始化数据的地方),它可能会工作得很好.)

于 2011-06-23T04:21:33.080 回答