小编Tan*_*Man的帖子

Dot Product/w Neon Intrinsics

我正在尝试使用Neon内在函数为ARM A8处理器编写优化的点积,但我遇到了一些麻烦.首先,是否有任何库已经实现了这个?我的代码似乎有效,但在运行时会导致一些安静的失败 - 我最好的猜测是因为与未经优化的代码相比,精度略有下降.有没有更好的方法来完成我想要做的事情?我将非常感谢任何帮助或建议.提前致谢.

这个特殊的点积是一个32位浮点*32位浮点复数.

这是未经优化的代码:

    double sum_re = 0.0;
    double sum_im = 0.0;
    for(int i=0; i<len; i++, src1++, src2++)
    {
            sum_re += *src1 * src2->re;
            sum_im += *src1 * src2->im;
    }
Run Code Online (Sandbox Code Playgroud)

这是我的优化版本:

    float sum_re = 0.0;
    float sum_im = 0.0;

    float to_sum_re[4] = {0,0,0,0};
    float to_sum_im[4] = {0,0,0,0};

    float32x4_t tmp_sum_re, tmp_sum_im, source1;
    float32x4x2_t source2;
    tmp_sum_re = vld1q_f32(to_sum_re);
    tmp_sum_im = vld1q_f32(to_sum_im);

    int i = 0;

    while (i < (len & ~3)) {
            source1 = vld1q_f32(&src1[i]);
            source2 = vld2q_f32((const float32_t*)&src2[i]);

            tmp_sum_re …
Run Code Online (Sandbox Code Playgroud)

c++ floating-point optimization arm neon

1
推荐指数
1
解决办法
4312
查看次数

标签 统计

arm ×1

c++ ×1

floating-point ×1

neon ×1

optimization ×1