首页 > 解决方案 > 霓虹灯代码比普通的 C 代码慢一点。但是,我预计霓虹灯的速度会快 3 到 4 倍。任何建议如何提高性能?

问题描述

C代码:

for(unsigned int j=0; j<num_boxes; j++)
{
    loc_del[0] = prior_boxes[0] + loc_del[0]*variances[0] * prior_boxes[2];
    loc_del[1] = prior_boxes[1] + loc_del[1] * variances[0] * prior_boxes[3];
    loc_del[2] = prior_boxes[2] * std::exp(loc_del[2] * variances[1]);
    loc_del[3] = prior_boxes[3] * std::exp(loc_del[3] * variances[1]);

    loc_del[0] = (loc_del[0] - loc_del[2] * 0.5) * width;
    loc_del[1] = (loc_del[1] - loc_del[3] * 0.5) * height;
    loc_del[2] = (loc_del[2] * width )+ loc_del[0];
    loc_del[3] = (loc_del[3]  * height)+ loc_del[1];

    prior_boxes += 4;
    loc_del += 4;
}

霓虹灯代码:

    for(unsigned int j=0; j<for_lmt; j++)
    {
            vloc_del = vld4q_f32(loc_del);
            vprior_boxes = vld4q_f32(prior_boxes);
            ovloc_del = {vmlaq_f32(vprior_boxes.val[0],  vmulq_f32(vloc_del.val[0], var1_32x4), vprior_boxes.val[2]),
                    vmlaq_f32(vprior_boxes.val[1], vmulq_f32(vloc_del.val[1], var1_32x4), vprior_boxes.val[3]),
                    vmulq_f32(vprior_boxes.val[2], vexpq_f32(vmulq_f32(vloc_del.val[2], var2_32x4))),
                    vmulq_f32(vprior_boxes.val[3], vexpq_f32(vmulq_f32(vloc_del.val[3], var2_32x4)))};
           tmp1 = vmlsq_f32(ovloc_del.val[0], ovloc_del.val[2], _0_5_32x4);
           tmp2 = vmlsq_f32(ovloc_del.val[1], ovloc_del.val[3], _0_5_32x4);
           ovloc_del = {vmulq_f32(tmp1, width_32x4), vmulq_f32(tmp2, height_32x4), vmulq_f32(vaddq_f32(ovloc_del.val[2], tmp1), width_32x4), vmulq_f32(vaddq_f32(ovloc_del.val[3], tmp2), height_32x4)};
           vst4q_f32(loc_del, ovloc_del);
           prior_boxes += 16;
           loc_del += 16;
    }

我想使用 NEON 来并行化浮点乘法:同时进行四个浮点乘法而不是一个。

标签: c++gccarmsimdneon

解决方案


推荐阅读