用sse表现内在函数

用sse表现内在函数,第1张

概述我目前正在开始使用SSE. 我之前关于SSE( Mutiplying vector by constant using SSE)的问题的答案让我想到了测试使用像_mm_mul_ps()这样的内在函数和使用’常规运算符'(不确定最佳术语是什么)之类的区别*. 所以我写了两个测试用例,只是计算结果的方式不同: 方法1: int main(void){ float4 a, b, c; 我目前正在开始使用SSE.
我之前关于SSE( Mutiplying vector by constant using SSE)的问题的答案让我想到了测试使用像_mm_mul_ps()这样的内在函数和使用’常规运算符'(不确定最佳术语是什么)之类的区别*.

所以我写了两个测试用例,只是计算结果的方式不同:
方法1:

int main(voID){    float4 a,b,c;    a.v = _mm_set_ps(1.0f,2.0f,3.0f,4.0f);    b.v = _mm_set_ps(-1.0f,-2.0f,-3.0f,-4.0f);    printf("method 1\n");    c.v = a.v + b.v;      // <---    print_vector(a);    print_vector(b);    printf("1.a) Computed output 1: ");    print_vector(c);    exit(EXIT_SUCCESS);}

方法2:

int main(voID){    float4 a,-4.0f);    printf("\nmethod 2\n");    c.v = _mm_add_ps(a.v,b.v);      // <---    print_vector(a);    print_vector(b);    printf("1.b) Computed output 2: ");    print_vector(c);    exit(EXIT_SUCCESS);}

两个测试用例共享以下内容:

typedef union float4{    __m128  v;    float   x,y,z,w;} float4;voID print_vector (float4 v){    printf("%f,%f,%f\n",v.x,v.y,v.z,v.w);}

所以要比较为我编译的两种情况生成的代码:
gcc -ggdb -msse -c t_vectorExtensions_method1.c

结果导致(仅显示添加两个向量的部分 – 不同):
方法1:

c.v = a.v + b.v;  a1:   0f 57 c9                xorps  %xmm1,%xmm1  a4:   0f 12 4d d0             movlps -0x30(%rbp),%xmm1  a8:   0f 16 4d d8             movhps -0x28(%rbp),%xmm1  ac:   0f 57 c0                xorps  %xmm0,%xmm0  af:   0f 12 45 c0             movlps -0x40(%rbp),%xmm0  b3:   0f 16 45 c8             movhps -0x38(%rbp),%xmm0  b7:   0f 58 c1                addps  %xmm1,%xmm0  ba:   0f 13 45 b0             movlps %xmm0,-0x50(%rbp)  be:   0f 17 45 b8             movhps %xmm0,-0x48(%rbp)

方法2:

c.v = _mm_add_ps(a.v,b.v);  a1:   0f 57 c0                xorps  %xmm0,%xmm0  a4:   0f 12 45 a0             movlps -0x60(%rbp),%xmm0  a8:   0f 16 45 a8             movhps -0x58(%rbp),%xmm0  ac:   0f 57 c9                xorps  %xmm1,%xmm1  af:   0f 12 4d b0             movlps -0x50(%rbp),%xmm1  b3:   0f 16 4d b8             movhps -0x48(%rbp),%xmm1  b7:   0f 13 4d f0             movlps %xmm1,-0x10(%rbp)  bb:   0f 17 4d f8             movhps %xmm1,-0x8(%rbp)  bf:   0f 13 45 e0             movlps %xmm0,-0x20(%rbp)  c3:   0f 17 45 e8             movhps %xmm0,-0x18(%rbp)/* Perform the respective operation on the four SPFP values in A and B.  */extern __inline __m128 __attribute__((__gnu_inline__,__always_inline__,__artificial__))_mm_add_ps (__m128 __A,__m128 __B){  return (__m128) __builtin_ia32_addps ((__v4sf)__A,(__v4sf)__B);  c7:   0f 57 c0                xorps  %xmm0,%xmm0  ca:   0f 12 45 e0             movlps -0x20(%rbp),%xmm0  ce:   0f 16 45 e8             movhps -0x18(%rbp),%xmm0  d2:   0f 57 c9                xorps  %xmm1,%xmm1  d5:   0f 12 4d f0             movlps -0x10(%rbp),%xmm1  d9:   0f 16 4d f8             movhps -0x8(%rbp),%xmm1  dd:   0f 58 c1                addps  %xmm1,%xmm0  e0:   0f 13 45 90             movlps %xmm0,-0x70(%rbp)  e4:   0f 17 45 98             movhps %xmm0,-0x68(%rbp)

显然,使用内在_mm_add_ps()时生成的代码要大得多.为什么是这样?它不应该导致更好的代码?

解决方法 所有真正重要的是addps.在一个更实际的用例中,你可能会在循环中添加两个浮点向量,循环体只包含addps,两个加载和一个存储,以及一些用于地址算术的标量整数指令.在现代超标量cpu上,许多这些指令将并行执行.

另请注意,您正在编译已禁用优化,因此您将无法获得特别高效的代码.试试gcc -O3 -msse3 ….

总结

以上是内存溢出为你收集整理的用sse表现内在函数全部内容,希望文章能够帮你解决用sse表现内在函数所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1225407.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存