C++ SSE运算例子

举报
风吹稻花香 发表于 2021/06/05 01:17:24 2021/06/05
【摘要】 参考:http://blog.163.com/chenqneu@126/blog/static/45738484200781493846369/ C++ SSE浮点运算实例(__m128) 实验环境VC++ 8.0 (1) #include "stdafx.h" #include "omp.h" #include <xmmintrin...

参考:http://blog.163.com/chenqneu@126/blog/static/45738484200781493846369/

C++ SSE浮点运算实例(__m128)








































































































































































_mm_loadu_ps,_mm_storeu_ps()来处理,不过因为没对齐,所以处理速度会慢一些。
(6)
#include "stdafx.h"
#include "omp.h"
#include <xmmintrin.h>
#include <iostream>
using namespace std;
const int N=120;

int _tmain(int argc, _TCHAR* argv[])
{
    __m128 m1,m2,m3;
    __declspec(align(16)) float *pf1,*pf2,*pf3;
    pf1=(float*)malloc(sizeof(float)*N);
    pf2=(float*)malloc(sizeof(float)*N);
    pf3=(float*)malloc(sizeof(float)*N);
    for(int i=0;i<N;i++){
        pf1[i]=i+0.12;
        pf2[i]=i+0.16;
    };
    for(int i=0;i<N;i+=4){
        m1=_mm_loadu_ps(pf1+i);
        m2=_mm_loadu_ps(pf2+i);
        m3=_mm_add_ps(m1,m2);
        _mm_storeu_ps(pf3+i,m3);
    }
    for(int i=0;i<N;i++)
        cout<<dec<<pf3[i]<<endl;
    free(pf1);
    free(pf2);
    free(pf3);
    return 0;

}


下面是几个简单的例子: 


float sumfloat_sse(const float* pbuf, size_t cntbuf)
{
 float s = 0; // 求和变量.
 size_t i;
 size_t nBlockWidth = 4; // 块宽. SSE寄存器能一次处理4float.
 size_t cntBlock = cntbuf / nBlockWidth; // 块数.
 size_t cntRem = cntbuf % nBlockWidth;   // 剩余数量.
 __m128 xfsSum = _mm_setzero_ps();   // 求和变量。[SSE] 赋初值0
 __m128 xfsLoad; // 加载.
 const float* p = pbuf;  // SSE批量处理时所用的指针.
 const float* q; // SSE变量上的多个数值合并时所用指针.
 // SSE批量处理.
 for(i=0; i<cntBlock; ++i)
 {
 xfsLoad = _mm_load_ps(p);   // [SSE] 加载
 xfsSum = _mm_add_ps(xfsSum, xfsLoad);   // [SSE] 单精浮点紧缩加法
 p += nBlockWidth;
 }
 // 合并.
 q = (const float*)&xfsSum;
 s = q[0] + q[1] + q[2] + q[3];
 // 处理剩下的.
 for(i=0; i<cntRem; ++i)
 {
 s += p[i];
 }
 return s;
}
int main(){
float norm=0.5f,S=0.25,M=0.8f;
float *a;
  *a=2.0f;
float* res=new float[4];
__m128 _res;
const __m128 _s=sse::SET(S);
const __m128 _m=sse::SET(M);
//乘法
_res= sse::MUL(*a,_m);
// float *res2=(float *)_In;
 memcpy(res,&_res,16);
 printf("res:%.9f,%.9f,%.9f\n",res[0],res[1],res[2]);
 //开平方的导数
_res=sse::RCPSQRT(_s);
memcpy(res,&_res,16);
printf("RCPSQRT:%.9f,%.9f,%.9f\n",res[0],res[1],res[2]);
//除法
_res=sse::RCP(_s);//开平方的导数
memcpy(res,&_res,16);
printf("RCP:%.9f,%.9f,%.9f\n",res[0],res[1],res[2]);
 float *f;
 int  n=10; // 数组的位数
 f = new float[n];
 for(int i=0;i<n;i++)
 f[i] = i;
 
 // for(int i=0;i<n;i++)  cout << f[i] << "  ";
 
 float  aaa=  sumfloat_sse(f,n);
 printf("result:%f",aaa);
 delete [] f;

文章来源: blog.csdn.net,作者:网奇,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/jacke121/article/details/61925930

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。