我只是想检查优化一些基本例程的最佳方法。在这种情况下,我尝试了将 2 个浮点向量相乘的非常简单的示例:
void Mul(float *src1, float *src2, float *dst)
{
for (int i=0; i<cnt; i++) dst[i] = src1[i] * src2[i];
};
Run Code Online (Sandbox Code Playgroud)
普通的 C 实现非常慢。我使用 AVX 做了一些外部 ASM,也尝试使用内在函数。这些是测试结果(时间越小越好):
ASM: 0.110
IPP: 0.125
Intrinsics: 0.18
Plain C++: 4.0
Run Code Online (Sandbox Code Playgroud)
(使用 MSVC 2013、SSE2 编译,尝试过 Intel 编译器,结果几乎相同)
正如您所看到的,我的 ASM 代码甚至击败了 Intel Performance Primitives(可能是因为我做了很多分支以确保我可以使用 AVX 对齐指令)。但我个人更喜欢使用内在方法,它更易于管理,我认为编译器应该在优化所有分支和内容方面做得最好(我的 ASM 代码在这方面很糟糕,但速度更快)。所以这是使用内在函数的代码:
int i;
for (i=0; (MINTEGER)(dst + i) % 32 != 0 && i < cnt; i++) dst[i] = src1[i] * src2[i];
if ((MINTEGER)(src1 + i) % 32 …Run Code Online (Sandbox Code Playgroud)