Как бы вы написали код для добавления без знака, который, вероятно, был бы оптимизирован в одну инструкцию SSE? - PullRequest
7 голосов
/ 24 мая 2011

Как на C или C ++ написать код для добавления без знака двух массивов, которые, вероятно, будут оптимизированы, скажем, GCC, в одну 128-битную инструкцию добавления без знака SSE?

Ответы [ 2 ]

3 голосов
/ 24 мая 2011
// N number of ints to be added
// a, b input array
// c sum array
// nReg number of required vector registers

const unsigned nReg = N*sizeof(uint32_t)/sizeof(__v4si);
__v4si a[nReg], b[nReg], c[nReg];
for (unsigned i=0; i<nReg; ++i)
    c[i] = _mm_add_epi32(a[i], b[i]);

// in c++ simply
for (unsigned i=0; i<nReg; ++i)
    c[i] = a[i] + b[i];

Разверните элементы цикла и предварительной выборки по вашему желанию. Профилирование рекомендуется. Замените __v4si на __v16qi, __v8hi, __v2di для 8, 16, 64-битных значений.

1 голос
/ 25 мая 2011
for (i=0; i<N; i++) c[i] = a[i] + b[i];
...