也许是因为我分别传递了每个参数,就像这样……
__m128i a = _mm_set_epi32(pa[0],pa[1],pa[2],pa[3]); __m128i b = _mm_set_epi32(pb[0],pb[1],pb[2],pb[3]); __m128i res = _mm_add_epi32(a,b); for( i = 0; i < 4; i++ ) po[i] = res.m128i_i32[i];
有没有办法我可以一次性传递所有4个整数,我的意思是一次性传递整个128字节的pa?并一次性将res.m128i_i32分配给po?
解决方法
你基本上陷入了捕获大多数初次使用者的陷阱.基本上你的例子有两个问题:
>您滥用_mm_set_epi32().
>您的计算/负载存储比率非常低. (在您的示例中为1到3)
_mm_set_epi32()是一种非常昂贵的内在函数.虽然使用起来很方便,但它不能编译成单个指令.使用_mm_set_epi32()时,某些编译器(如VS2010)可能会生成性能很差的代码.
相反,由于您正在加载连续的内存块,因此应使用_mm_load_si128().这要求指针对齐16个字节.如果你不能保证这种对齐方式,你可以使用_mm_loadu_si128() – 但性能会受到影响.理想情况下,您应该正确对齐数据,以便不需要使用_mm_loadu_si128().
使用SSE真正高效,您还需要最大化计算/负载存储比率.我拍摄的目标是每个存储器访问3-4个算术指令.这是一个相当高的比例.通常,您必须重构代码或重新设计算法以增加代码.结合数据传递是一种常见的方法.
当您拥有具有长依赖关系链的大型循环体时,通常需要循环展开以最大化性能.
成功使用SSE实现加速的SO问题的一些示例.
> C code loop performance(非矢量化)
> C code loop performance [continued](矢量化)
> How do I achieve the theoretical maximum of 4 FLOPs per cycle?(实现峰值处理器性能的人为实例)
原文地址:https://www.jb51.cc/c/111542.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。