AVX512点积循环仅提速10.6倍,未达预期16倍的性能疑问
问题:AVX512实现点积性能未达预期的分析与优化疑问
我需要实现数组与数组对应浮点数的乘积求和(点积),数组规模可达数万个元素,且要每秒运行约10万次处理实时数据流,性能优先级极高。
我分别用常规数学实现和AVX512实现了该逻辑,但AVX512版本仅比常规版本快约10.6倍——按单条AVX512指令可处理16个操作的特性,我预期能达到约16倍的性能提升;而且AVX512版本的循环开销(循环变量、递增、分支判断等)仅为普通版本的1/16,这点也没体现出应有的优势。
编译环境为Visual Studio 2022社区版Release模式,运行平台是Intel i7-11700F处理器。
核心代码逻辑
每次遍历两个数组的16个元素,相乘后维护16个累加和,最终用_mm512_reduce_add_ps()把16个结果求和:
vector<__m512> a512In; vector<__m512> a512IRCurr; __m512 fOut = _mm512_set1_ps( 0.0 ); for ( iSample = 0; iSample < iIterations; iSample++ ) fOut = _mm512_add_ps( fOut, _mm512_mul_ps( a512In[ iPos++ ], a512IRCurr[ iSample ] ) );
观察到的问题与疑问
- 从生成的汇编中看到使用了
vmovups指令(不假定目标地址对齐),我怀疑这是性能未达预期的原因。虽然多代Intel CPU中对齐与非对齐版本的指令速度相近,但有资料显示两者仍可能存在延迟差异。我熟悉6502汇编,但对现代Intel指令集了解有限。 - 对于
a = a + b*c这类操作,_mm512_add_ps是否为最优指令?有没有更高效的、类似a += b*c的指令可以用?
生成的汇编代码
for ( iSample = 0; iSample < iIterations; iSample++ ) 00007FF6677B2958 movsxd r8,edi 00007FF6677B295B test edi,edi 00007FF6677B295D jle Circle2AVR512::ProcessInput+0AEh (07FF6677B298Eh) fOut = _mm512_add_ps( fOut, _mm512_mul_ps( a512In[ iPos++ ], 00007FF6677B295F movsxd r9,eax 00007FF6677B2962 mov rdx,r11 00007FF6677B2965 shl r9,6 00007FF6677B2969 mov ecx,edi 00007FF6677B296B sub r9,r11 00007FF6677B296E add r9,qword ptr [r10] 00007FF6677B2971 vmovups zmm0,zmmword ptr [r9+rdx] 00007FF6677B2978 vmulps zmm1,zmm0,zmmword ptr [rdx] 00007FF6677B297E lea rdx,[rdx+40h] 00007FF6677B2982 vaddps zmm2,zmm2,zmm1 00007FF6677B2988 sub r8,1 00007FF6677B298C jne Circle2AVR512::ProcessInput+91h (07FF6677B2971h) a512IRCurr[ iSample ] ) );
内容的提问来源于stack exchange,提问作者Swiss Frank
相关产品推荐
相关产品推荐

