C++ SSE运算例子
【摘要】
参考:http://blog.163.com/chenqneu@126/blog/static/45738484200781493846369/ C++ SSE浮点运算实例(__m128)
实验环境VC++ 8.0
(1)
#include "stdafx.h"
#include "omp.h"
#include <xmmintrin...
_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寄存器能一次处理4个float. 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)