Optimization 以奇数顺序水平添加向量元素的最快方法是什么?
据我所知,这次我实现了5乘5和7乘7的水平加法。它正确地完成了任务,但速度不够快。 它能比现在快吗?我尝试使用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
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