Performance 使用AVX编译的libsvm与不使用AVX编译的libsvm
我编译了一个libsvm基准测试应用程序,它使用相同的模型对同一张图像进行100次svm_predict()。libsvm是通过在我的项目中直接包含svm.cpp和svm.h静态编译的(MSVC 2017) 编辑:添加基准详细信息Performance 使用AVX编译的libsvm与不使用AVX编译的libsvm,performance,visual-c++,x86,compiler-optimization,libsvm,Performance,Visual C++,X86,Compiler Optimization,Libsvm,我编译了一个libsvm基准测试应用程序,它使用相同的模型对同一张图像进行100次svm_predict()。libsvm是通过在我的项目中直接包含svm.cpp和svm.h静态编译的(MSVC 2017) 编辑:添加基准详细信息 for (int i = 0; i < counter; i++) { std::chrono::high_resolution_clock::time_point t1 = std::chrono::high_resolution_cl
for (int i = 0; i < counter; i++)
{
std::chrono::high_resolution_clock::time_point t1 = std::chrono::high_resolution_clock::now();
double label = svm_predict(model, input);
std::chrono::high_resolution_clock::time_point t2 = std::chrono::high_resolution_clock::now();
auto duration = std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1).count();
total_time += duration;
std::cout << "\n\n\n" << sum << " label:" << label << " duration:" << duration << "\n\n\n";
}
另一部分
without AVX:
*isa-ext-SSE 11781
*isa-ext-SSE2 36574119
*isa-set-SSE 11781
*isa-set-SSE2 36574119
*scalar-simd 36564559
*sse-scalar 36564559
*sse-packed 21341
我希望得到一些性能改进,因为我知道avx128/256/512使用得不多,但仍然使用。我有一个i7-8550U CPU,你认为如果在skylake i9 X系列上运行相同的测试,我会看到更大的差异吗
编辑
我为每个二进制文件添加了指令混合
With AVX:
ADD 16868725
AND 49
BT 6
CALL_NEAR 14032515
CDQ 4
CDQE 3601
CMOVLE 6
CMOVNZ 2
CMOVO 12
CMOVZ 6
CMP 25417120
CMPXCHG_LOCK 1
CPUID 3
CQO 12
DEC 68
DIV 1
IDIV 12
IMUL 3621
INC 8496372
JB 325
JBE 5
JL 7101
JLE 38338
JMP 8416984
JNB 6
JNBE 3
JNL 806
JNLE 61
JNS 1
JNZ 22568320
JS 2
JZ 8465164
LEA 16829868
MOV 42209230
MOVSD_XMM 4
MOVSXD 1141
MOVUPS 4
MOVZX 3684
MUL 12
NEG 72
NOP 4219
NOT 1
OR 14
POP 1869
PUSH 1870
REP_STOSD 6
RET_NEAR 1758
ROL 5
ROR 10
SAR 8
SBB 5
SETNZ 4
SETZ 26
SHL 1626
SHR 519
SUB 6530
TEST 5616533
VADDPD 594
VADDSD 8445597
VCOMISD 3
VCVTSI2SD 3603
VEXTRACTF128 6
VFMADD132SD 12
VFMADD231SD 6
VHADDPD 6
VMOVAPD 12
VMOVAPS 2375
VMOVDQU 1
VMOVSD 11256384
VMOVUPD 582
VMULPD 582
VMULSD 8451540
VPXOR 1
VSUBSD 8407425
VUCOMISD 3600
VXORPD 2362
VXORPS 3603
VZEROUPPER 4
XCHG 8
XGETBV 1
XOR 8414763
*total 213991340
第二部分
您列出的几乎所有算术指令都是针对标量的,例如,means SUBstract Scalar Double。前面的
V
基本上只是意味着使用了AVX编码(这也会清除寄存器的上半部分,而SSE指令不会这样做)。但是根据您列出的说明,在运行时应该没有什么不同
现代x86使用SSE1/2或AVX进行标量FP运算,只使用XMM向量寄存器的低位元素。它比x87(更多的寄存器和平面寄存器集)要好一些,但每个指令仍然只有一个结果
有几千条压缩SIMD指令,而标量指令约为3600万条,因此只有相对不重要的部分代码得到了自动矢量化,并且可以从256位矢量中获益。MVS指的是MSVC?请注意,无AVX版本中SSE2指令的数量与AVX版本中的AVX指令的数量相同。此外,标量simd在这两种情况下大致相同。我不确定这些指令类是否相互包含,但我认为它们可以相互包含。这意味着无论是否启用AVX,这些SIMD指令中的大多数实际上都是在标量模式下使用的。@HadiBrais标量模式是什么意思?你能详细说明一下吗?是的,我的意思是msvc您是否查看了库的反汇编,并看到了大量向量指令,如
(v)addps
,(v)mulps
,等等?相反,如果你大部分都有addss
和mulss
指令,那么代码就没有矢量化。但是你说你在项目中包含了svm.cpp
,所以也在编译。是的,一些东西的自动矢量化很明显在工作,但可能只是一个初始化循环。这只是几千条指令,而不是36M条标量指令。显然,这取决于你使用的SVM库函数。这一个似乎没有对SIMD进行有意义的使用。(哦,我把SVM和SVML(,它不是开源的)搞混了。)参见chtz的答案。x86使用SSE1/2或AVX进行标量FP数学,只使用XMM向量寄存器的低位元素。它比x87(更多寄存器和平坦寄存器集)要好一些,但每个指令仍然只有一个结果。是的,MSVC知道使用VZEROUPPER来避免错误依赖等惩罚。可能如果您使用AVX内在函数而不使用-arch:AVX
编译,您可能会欺骗它不这样做,至少在较旧版本的编译器中,我记得我让它发出混合SS没有-arch:AVX
的E/AVX代码。但希望它能阻止你射中自己的脚。(除非你告诉它为KNL Xeon Phi调音,因为vzeroupper速度慢而且没有帮助。)@哈迪布雷斯:我不相信OP的每指令数。其中一个指令的总指令数远远超过另一个,因此可能需要更多的迭代。例如,126Mcmp
vs.25M。因此,循环迭代的次数可能是原来的5倍,与标量指令的5倍差异相匹配。有一些差异,比如JZ与JNZ的比率,虽然。AVX的比率为2.6,只有SSE的比率为2.1。@chtz我的理解是,所有列表都显示了动态指令的数量。只是前两个列表将所有指令分类为可能重叠的类。@chtz这取决于处理器。无论如何,不清楚为什么它们具有相同的性能ance。我怀疑它们有不同的瓶颈。如果不彻底检查代码中的热循环,就很难判断。@HadiBrais看来你对指令总数的看法是正确的。我针对不同的循环数运行了它。我更新了指令计数器,现在看起来更好了。还包括指令总数谢谢
With AVX:
ADD 16868725
AND 49
BT 6
CALL_NEAR 14032515
CDQ 4
CDQE 3601
CMOVLE 6
CMOVNZ 2
CMOVO 12
CMOVZ 6
CMP 25417120
CMPXCHG_LOCK 1
CPUID 3
CQO 12
DEC 68
DIV 1
IDIV 12
IMUL 3621
INC 8496372
JB 325
JBE 5
JL 7101
JLE 38338
JMP 8416984
JNB 6
JNBE 3
JNL 806
JNLE 61
JNS 1
JNZ 22568320
JS 2
JZ 8465164
LEA 16829868
MOV 42209230
MOVSD_XMM 4
MOVSXD 1141
MOVUPS 4
MOVZX 3684
MUL 12
NEG 72
NOP 4219
NOT 1
OR 14
POP 1869
PUSH 1870
REP_STOSD 6
RET_NEAR 1758
ROL 5
ROR 10
SAR 8
SBB 5
SETNZ 4
SETZ 26
SHL 1626
SHR 519
SUB 6530
TEST 5616533
VADDPD 594
VADDSD 8445597
VCOMISD 3
VCVTSI2SD 3603
VEXTRACTF128 6
VFMADD132SD 12
VFMADD231SD 6
VHADDPD 6
VMOVAPD 12
VMOVAPS 2375
VMOVDQU 1
VMOVSD 11256384
VMOVUPD 582
VMULPD 582
VMULSD 8451540
VPXOR 1
VSUBSD 8407425
VUCOMISD 3600
VXORPD 2362
VXORPS 3603
VZEROUPPER 4
XCHG 8
XGETBV 1
XOR 8414763
*total 213991340
No AVX:
ADD 16869910
ADDPD 1176
ADDSD 8445609
AND 49
BT 6
CALL_NEAR 14032515
CDQ 4
CDQE 3601
CMOVLE 6
CMOVNZ 2
CMOVO 12
CMOVZ 6
CMP 25417408
CMPXCHG_LOCK 1
COMISD 3
CPUID 3
CQO 12
CVTDQ2PD 3603
DEC 68
DIV 1
IDIV 12
IMUL 3621
INC 8496369
JB 325
JBE 5
JL 7392
JLE 38338
JMP 8416984
JNB 6
JNBE 3
JNL 803
JNLE 61
JNS 1
JNZ 22568317
JS 2
JZ 8465164
LEA 16829548
MOV 42209235
MOVAPS 7073
MOVD 3603
MOVDQU 2
MOVSD_XMM 11256376
MOVSXD 1141
MOVUPS 2344
MOVZX 3684
MUL 12
MULPD 1170
MULSD 8451546
NEG 72
NOP 4159
NOT 1
OR 14
POP 1865
PUSH 1866
REP_STOSD 6
RET_NEAR 1758
ROL 5
ROR 10
SAR 8
SBB 5
SETNZ 4
SETZ 26
SHL 1626
SHR 516
SUB 6515
SUBSD 8407425
TEST 5616533
UCOMISD 3600
UNPCKHPD 6
XCHG 8
XGETBV 1
XOR 8414745
XORPS 2364
*total 214000270