Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Optimization 以奇数顺序水平添加向量元素的最快方法是什么?_Optimization_X86_Simd_Intrinsics_Avx2 - Fatal编程技术网

Optimization 以奇数顺序水平添加向量元素的最快方法是什么?

Optimization 以奇数顺序水平添加向量元素的最快方法是什么?,optimization,x86,simd,intrinsics,avx2,Optimization,X86,Simd,Intrinsics,Avx2,据我所知,这次我实现了5乘5和7乘7的水平加法。它正确地完成了任务,但速度不够快。 它能比现在快吗?我尝试使用hadd和其他指令,但改进受到限制。例如,当我使用\u mm256\u bsrli\u epi128时,它稍微好一点,但它需要一些额外的排列,这会因为车道而破坏好处。因此,问题是应该如何实现它以获得更高的性能。同样的故事也适用于9个元素等 这将水平添加5个元素,并将结果放置在0、5和10处: //它将结果放在0、5和10处 内嵌式m256i mm256 hadd5x5 epi16(m25

据我所知,这次我实现了5乘5和7乘7的水平加法。它正确地完成了任务,但速度不够快。 它能比现在快吗?我尝试使用
hadd
和其他指令,但改进受到限制。例如,当我使用
\u mm256\u bsrli\u epi128
时,它稍微好一点,但它需要一些额外的排列,这会因为车道而破坏好处。因此,问题是应该如何实现它以获得更高的性能。同样的故事也适用于9个元素等

这将水平添加5个元素,并将结果放置在0、5和10处:

//它将结果放在0、5和10处
内嵌式m256i mm256 hadd5x5 epi16(m256i a)
{
__m256i a1、a2、a3、a4;
a1=校准器epi8(\uMM256\uPermute2x128\uSI256(a,\uMM256\uSetZero\uSI256(),0x31),a,1*2);
a2=校准器epi8(\uMM256\uPermute2x128\uSI256(a,\uMM256\uSetZero\uSI256(),0x31),a,2*2);
a3=_mm256_bsrli_epi128(a2,2);
a4=mm256_bsrli_epi128(a3,2);
返回"mm256"添加"epi16(mm256"添加"epi16)(mm256"添加"epi16(a1,a2),"mm256"添加"epi16(a;
}
这将水平添加7个元素,并将结果放在0和7处:

inline\uuuum256i\umm256\uhadd7x7\uepi16(\uuuum256i a)
{
__m256i a1、a2、a3、a4、a5、a6;
a1=校准器epi8(\uMM256\uPermute2x128\uSI256(a,\uMM256\uSetZero\uSI256(),0x31),a,1*2);
a2=校准器epi8(\uMM256\uPermute2x128\uSI256(a,\uMM256\uSetZero\uSI256(),0x31),a,2*2);
a3=校准器epi8(\uMM256\uPermute2x128\uSI256(a,\uMM256\uSetZero\uSI256(),0x31),a,3*2);
a4=校准器epi8(\uMM256\uPermute2x128\uSI256(a,\uMM256\uSetZero\uSI256(),0x31),a,4*2);
a5=校准器epi8(\uMM256\uPermute2x128\uSI256(a,\uMM256\uSetZero\uSI256(),0x31),a,5*2);
a6=mm256_Aligner_epi8(mm256_permute2x128_si256(a,mm256_setzero_si256(),0x31),a,6*2);
返回"mm256"添加"epi16("mm256"添加"epi16(a1,a2),"mm256"添加"epi16(a5,a6),"mm256"添加"epi16(a5,a6,a);
}

实际上,用更少的指令计算这些总和是可能的。想法是积累 部分和不仅在第10、5和0列中,而且在其他列中。这减少了
vpaddw
说明以及与您的解决方案相比的“洗牌”次数

#包括
#包括
/*gcc-O3-Wall-m64-march=haswell hor_sum5x5.c*/
int print_vec_short(__m256ix);
int print_10_5_0_short(uu m256i x);
__m256i-mm256-hadd5x5-epi16(m256i-a);
__m256i-mm256-hadd7x7-epi16(m256i-a);
int main(){
短x[16];

对于(int i=0;i完美的解决方案。从0到9的9个相邻元素如何,并将总和放在0处?@FackedDeveloper:您可以通过两个步骤完成此操作:1.将总和中不需要的短整数归零。2.计算所有16个短整数的(完整)水平和:
tb=\u mm256\u和\u si256(ta,\u mm256\u set\16(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 0,0,0 0,0 0 0 0,0 0 0,0 0,0 0,0 0 0 0,0 0 0,0 0 0 0,0 0 0,0,0,0,0,0,0,0,0 0,0,0 0,0 0 0 0,0 0 0,0 0,0,0,0,0,0,0,0 0,0,0,0 0,0,0 0,0 0,0,0,0 0 0,0,0,0,0,0,0,0,0 0 0,0,0,0,0,0,0 0,0,0,0 0,0 0 0 0 0,0,0 0 0,0 0 0,0 0,0,0,0,0,0,0,0,0 0 0,0 0 0,0,0,0 0 0 0,0 0,0,0 0 0 0 0 0 th,8);总和=\u mm256\u相加\u epi16(ti,th);
$ ./a.out
t0  =   16   15   14   13 |   12   11   10    9 |    8    7    6    5  |    4    3    2    1 
t2  =    2    1   16   15 |   14   13   12   11 |   10    9    8    7  |    6    5    4    3 
t02 =   18   16   30   28 |   26   24   22   20 |   18   16   14   12  |   10    8    6    4 
t3  =    0    0    2    1 |   16   15   14   13 |    0    0   10    9  |    8    7    6    5 
t023=   18   16   32   29 |   42   39   36   33 |   18   16   24   21  |   18   15   12    9 
t13 =    0   18   16   30 |    0   26   24   22 |    0   18   16   14  |    0   10    8    6 
sum =   18   34   48   59 |   42   65   60   55 |   18   34   40   35  |   18   25   20   15 

Vector elements of interest: columns  10, 5, 0:
t0  [10, 5, 0]  =   11    6    1   
t2  [10, 5, 0]  =   13    8    3   
t02 [10, 5, 0]  =   24   14    4   
t3  [10, 5, 0]  =   15   10    5   
t023[10, 5, 0]  =   39   24    9   
t13 [10, 5, 0]  =   26   16    6   
sum [10, 5, 0]  =   65   40   15   

Sum with _mm256_hadd5x5_epi16(t0)
sum [10, 5, 0]  =   65   40   15   


Sum of short ints 13...7 and short ints 6...0:
t     =   16   15   14   13 |   12   11   10    9 |    8    7    6    5  |    4    3    2    1 
t0    =    8    0   14   13 |   12   11   10    9 |    0    7    6    5  |    4    3    2    1 
t1    =    9    8    0   14 |   13   12   11   10 |    1    0    7    6  |    5    4    3    2 
t01   =   17    8   14   27 |   25   23   21   19 |    1    7   13   11  |    9    7    5    3 
t23   =   21   19   17    8 |   14   27   25   23 |    5    3    1    7  |   13   11    9    7 
t0123 =   38   27   31   35 |   39   50   46   42 |    6   10   14   18  |   22   18   14   10 
t4567 =   39   50   46   42 |   38   27   31   35 |   22   18   14   10  |    6   10   14   18 
sum08 =   77   77   77   77 |   77   77   77   77 |   28   28   28   28  |   28   28   28   28 
sum   =   77   77   77   77 |   77   77   77   77 |   77   77   28   28  |   28   28   28   28 

Sum with _mm256_hadd7x7_epi16(t)     (the answer is in column 0 and in column 7)
sum   =   16   31   45   58 |   70   81   91   84 |   77   70   63   56  |   49   42   35   28