c++ - 霓虹灯代码比普通的 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 来并行化浮点乘法:同时进行四个浮点乘法而不是一个。
解决方案
推荐阅读
- codenameone - 显示包含 PDF 链接的空白页
- javascript - 如何正确比较 javascript 中的两个图像?
- python-2.7 - with open(src, 'rb') as fsrc: IOError: [Errno 22] invalid mode ('rb') or filename:
- javascript - Node.js 数组到带有换行符的文本
- http - 授权标头
- python-3.x - 以下帮助语句中的“/”是什么意思:__init__(self, /, *args, **kwargs)?
- android - 将程序从旧的 Android Studio 版本迁移到新版本的正确方法是什么?
- php - 如何为 Highcharts 向下钻取正确构建系列
- c# - UWP XAML 中的自定义边框控件
- jmeter - 如果我将 __intSum 函数添加到 beanshell 后处理器,则无法执行我的测试