Как загрузить байты в __m128i в определенной позиции

Мне нужно загрузить 4 байта, хранящихся последовательно в массиве, в определенной позиции переменной __m128i, а именно, чтобы иметь возможность делать много сумм int32_t, по 4 за раз, сохраняя все частичные результаты.

Например:

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;

Мне было интересно, есть ли более эффективный способ сделать это

1 ответ

Главная проблема здесь, конечно, заключается в следующем:

__m128i value = _mm_set_epi32 (a[3],a[2],a[1],a[0]);

Однако приличный компилятор должен генерировать достаточно эффективный код для этого. Посмотрите на вывод (gcc -O3 -S ...) - если это несколько инструкций, то вы можете рассмотреть возможность выполнения операций загрузки / распаковки самостоятельно.

Другие вопросы по тегам