Я реализовал встроенную функцию (_mm256_concat_epi16
). Он объединяет два вектора AVX2, содержащих 16-битные значения. Он отлично работает для первых 8 номеров. Если я хочу использовать его для остальной части вектора, я должен изменить реализацию. Но лучше было бы использовать одну встроенную функцию в моей основной программе.
Вопрос: Есть ли лучшее решение, чем мое или любое предложение, чтобы сделать эту встроенную функцию более общей, которая работает с 16 значениями вместо моего решения, которое работает на 8 значений? Мое решение объединяет 2 вектора, но разрешено только 8 состояний из 16 возможных состояний.
** EDIT * Мое текущее решение для этого вопроса - использование функции выравнивания нагрузки, которая точно может считываться из любой части из памяти. Но, когда данные готовы в регистре, лучше использовать их повторно. Тем не менее, это может вызвать узкие места на порту 5, которые вызывают перетасовку, перестановку и т.д. Но пропускной способности может быть достаточно (еще не проверили).
#include <stdio.h>
#include <x86intrin.h>
inline _mm256_print_epi16(__m256i a, char* name){
short temp[16], i;
_mm256_storeu_si256((__m256i *) &temp[0], a);
for(i=0; i<16; i++)
printf("%s[%d]=%4d , ",name,i+1,temp[i]);
printf("\n");
}
inline __m256i _mm256_concat_epi16(__m256i a, __m256i b, const int indx){
return _mm256_alignr_epi8(_mm256_permute2x128_si256(a,b,0x21),a,indx*2);
}
int main()
{
__m256i a = _mm256_setr_epi16(101,102,103,104,105,106,107,108,109,1010,1011,1012,1013,1014,1015,1016);_mm256_print_epi16(a, "a");
__m256i b = _mm256_setr_epi16(201,202,203,204,205,206,207,208,209,2010,2011,2012,2013,2014,2015,2016);_mm256_print_epi16(b, "b");
_mm256_print_epi16(_mm256_concat_epi16(a,b,8), "c");//numbers: 0-8
return 0;
}
Вывод:
// icc -march=native -O3 -D _GNU_SOURCE -o "concat" "concat.c"
[[email protected] concatination]$ "./concat"
a[1]= 101 , a[2]= 102 , a[3]= 103 , a[4]= 104 , a[5]= 105 , a[6]= 106 , a[7]= 107 , a[8]= 108 , a[9]= 109 , a[10]=1010 , a[11]=1011 , a[12]=1012 , a[13]=1013 , a[14]=1014 , a[15]=1015 , a[16]=1016 ,
b[1]= 201 , b[2]= 202 , b[3]= 203 , b[4]= 204 , b[5]= 205 , b[6]= 206 , b[7]= 207 , b[8]= 208 , b[9]= 209 , b[10]=2010 , b[11]=2011 , b[12]=2012 , b[13]=2013 , b[14]=2014 , b[15]=2015 , b[16]=2016 ,
c[1]= 109 , c[2]=1010 , c[3]=1011 , c[4]=1012 , c[5]=1013 , c[6]=1014 , c[7]=1015 , c[8]=1016 , c[9]= 201 , c[10]= 202 , c[11]= 203 , c[12]= 204 , c[13]= 205 , c[14]= 206 , c[15]= 207 , c[16]= 208 ,