Строгое псевдонимы и тип __m128i - PullRequest
2 голосов
/ 23 июня 2011

При использовании встроенных функций 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
    }
}

Спасибо!

1 Ответ

2 голосов
/ 23 июня 2011

Да; это нарушает строгие правила наложения имен. Два разных типа не могут указывать на одно и то же место в памяти. Здесь у вас есть x, указывающий на ввод, и y, указывающий на вывод, но они бывают разных типов.

Вы можете изменить сигнатуру своей функции, чтобы она принимала параметры __m128 *, но, вероятно, проще всего это оставить. Скорее всего, все будет работать нормально, если вы будете осторожны, если аргументы ввода / вывода указывают на память с соответствующими ограничениями выравнивания и размера (т.е. они должны каждый указывать на что-то, где ваш цикл не индексируется в конце, или загружать неинициализированные данные .)

...