gpt4 book ai didi

c++ - 性能 AVX/SSE 汇编与内部函数

转载 作者:搜寻专家 更新时间:2023-10-31 00:33:17 24 4
gpt4 key购买 nike

我只是想检查优化一些基本例程的最佳方法。在这种情况下,我尝试了将 2 个浮点 vector 相乘的非常简单的示例:

void Mul(float *src1, float *src2, float *dst)
{
for (int i=0; i<cnt; i++) dst[i] = src1[i] * src2[i];
};

纯 C 实现非常慢。我使用 AVX 做了一些外部 ASM,也尝试使用内部函数。以下是测试结果(时间,越小越好):

ASM: 0.110
IPP: 0.125
Intrinsics: 0.18
Plain C++: 4.0

(使用 MSVC 2013,SSE2 编译,试过 Intel Compiler,结果差不多)

如您所见,我的 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 == 0)
{
if ((MINTEGER)(src2 + i) % 32 == 0)
{
for (; i<cnt-8; i+=8)
{
__m256 x = _mm256_load_ps( src1 + i);
__m256 y = _mm256_load_ps( src2 + i);
__m256 z = _mm256_mul_ps(x, y);
_mm256_store_ps(dst + i, z);
};
}
else
{
for (; i<cnt-8; i+=8)
{
__m256 x = _mm256_load_ps( src1 + i);
__m256 y = _mm256_loadu_ps( src2 + i);
__m256 z = _mm256_mul_ps(x, y);
_mm256_store_ps(dst + i, z);
};
};
}
else
{
for (; i<cnt-8; i+=8)
{
__m256 x = _mm256_loadu_ps( src1 + i);
__m256 y = _mm256_loadu_ps( src2 + i);
__m256 z = _mm256_mul_ps(x, y);
_mm256_store_ps(dst + i, z);
};
};

for (; i<cnt; i++) dst[i] = src1[i] * src2[i];

简单:首先到达dst对齐到32字节的地址,然后分支检查哪些源是对齐的。

一个问题是开始和结束时的 C++ 实现不使用 AVX,除非我在编译器中启用 AVX,这是我不想要的,因为这应该只是 AVX 特化,但软件甚至应该可以工作AVX 不可用的平台。遗憾的是,对于诸如 vmovss 之类的指令似乎没有内在函数,因此将 AVX 代码与编译器使用的 SSE 混合可能会受到惩罚。然而,即使我在编译器中启用了 AVX,它仍然没有低于 0.14。

有什么想法可以优化它以使本征达到 ASM 代码的速度吗?

最佳答案

您使用内在函数的实现与您在直接 C 中的实现不同:例如如果使用参数 Mul(p, p, p+1) 调用您的函数会怎样?你会得到不同的结果。纯 C 版本很慢,因为编译器确保代码完全您所说的。

如果您希望编译器基于三个数组不重叠的假设进行优化,您需要明确说明:

void Mul(float *src1, float *src2, float *__restrict__ dst)

甚至更好

void Mul(const float *src1, const float *src2, float *__restrict__ dst)

(我认为只在输出指针上设置 __restrict__ 就足够了,尽管也可以将它添加到输入指针上)

关于c++ - 性能 AVX/SSE 汇编与内部函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29089302/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com