首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sse2浮点乘法

sse2浮点乘法
EN

Stack Overflow用户
提问于 2012-03-27 04:12:07
回答 1查看 2.1K关注 0票数 3

我尝试将一些代码从FANN Lib (用C编写的神经网络)移植到SSE2。但是SSE2的性能比正常代码更差。在我的SSE2实现运行中,一次运行需要5.50分钟,而不需要5.20分钟。

SSE2怎么会比正常运行慢呢?会不会是因为_mm_set_ps?我使用Apple LLVM Compiler (SSE4)编译代码(所有XCode扩展标志都为on,优化级别为-Os)。

不带SSE2的代码

代码语言:javascript
复制
                neuron_sum +=
                fann_mult(weights[i], neurons[i].value) +
                fann_mult(weights[i + 1], neurons[i + 1].value) +
                fann_mult(weights[i + 2], neurons[i + 2].value) +
                fann_mult(weights[i + 3], neurons[i + 3].value);

SSE2代码

代码语言:javascript
复制
                __m128 a_line=_mm_loadu_ps(&weights[i]);
                __m128 b_line=_mm_set_ps(neurons[i+3].value,neurons[i+2].value,neurons[i+1].value,neurons[i].value);
                __m128 c_line=_mm_mul_ps(a_line, b_line);
                neuron_sum+=c_line[0]+c_line[1]+c_line[2]+c_line[3];
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-27 04:37:56

要在这里看到任何加速的机会,您需要执行以下操作:

  • 确保weights[i]是16字节对齐的,然后使用_mm_load_ps而不是_mm_loadu_ps
  • reorganise neurons[],这样它就是SoA而不是AoS (也是16字节对齐的),然后使用_mm_load_ps一次加载4个值
  • 将水平和移出循环(有一个循环,对吧?) -只需在向量vneurom_sum中保留4个部分和,然后在循环<代码>H212<代码>F213之后对该向量执行一次最终的水平求和

即使这样,你也不会看到很大的加速,因为你只对2次加载和1次存储进行了一次算术运算。因为大多数现代x86 CPU都有两个标量浮点FPU,所以你可能无法接近128位浮点SIMD的4倍理论加速,我预计相对于标量代码,速度不会超过50%。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9879081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档