/*************************************************
*文件名:SSEProject.cpp
*版本:0.0
*功能描述:利用SSE函数优化浮点数据相乘的算法
*创建日期:2012-03-28
*作者:Brandy Yin
*修改记录:
*备注:我的第一个SSE算法
*************************************************/
#include <windows.h>
#include <xmmintrin.h>
#include<iostream>
#include "Time.h"
using std::cout;
using std::endl;
#define ArrayCount 1000
//使用SSE的函数
void f1(float* i_array,DWORD i_num,float i_mul)
{
DWORD num=i_num/4;
__m128 mul=_mm_set_ps1(i_mul);
for (int i=0;i!=num;i++)
{
*(__m128*)(i_array+i*4)=_mm_mul_ps(*(__m128*)(i_array+i*4),mul);
}
}
//不使用SSE的函数
void f2(float* i_array,DWORD i_num,float i_mul)
{
for (int i=0;i!=i_num;i++)
{
*(i_array+i)=(*(i_array+i))*i_mul;
}
}
int main()
{
//声明数组在内存中按16字节对齐
float _declspec(align(16)) Array[ArrayCount];
//利用memset函数初始化数组
memset(Array,0,sizeof(float)*ArrayCount);
CTime t;
t.Reset();
for (int i=0;i!=100000;i++)
{
f1(Array,ArrayCount,1000.2f);
}
cout<<"Use SSE: "<<t.End()<<"ms"<<endl;
t.Reset();
for (int i=0;i!=100000;i++)
{
f2(Array,ArrayCount,1000.2f);
}
cout<<"Don't Use SSE: "<<t.End()<<"ms"<<endl;
system("pause");
return 0;
*文件名:SSEProject.cpp
*版本:0.0
*功能描述:利用SSE函数优化浮点数据相乘的算法
*创建日期:2012-03-28
*作者:Brandy Yin
*修改记录:
*备注:我的第一个SSE算法
*************************************************/
#include <windows.h>
#include <xmmintrin.h>
#include<iostream>
#include "Time.h"
using std::cout;
using std::endl;
#define ArrayCount 1000
//使用SSE的函数
void f1(float* i_array,DWORD i_num,float i_mul)
{
DWORD num=i_num/4;
__m128 mul=_mm_set_ps1(i_mul);
for (int i=0;i!=num;i++)
{
*(__m128*)(i_array+i*4)=_mm_mul_ps(*(__m128*)(i_array+i*4),mul);
}
}
//不使用SSE的函数
void f2(float* i_array,DWORD i_num,float i_mul)
{
for (int i=0;i!=i_num;i++)
{
*(i_array+i)=(*(i_array+i))*i_mul;
}
}
int main()
{
//声明数组在内存中按16字节对齐
float _declspec(align(16)) Array[ArrayCount];
//利用memset函数初始化数组
memset(Array,0,sizeof(float)*ArrayCount);
CTime t;
t.Reset();
for (int i=0;i!=100000;i++)
{
f1(Array,ArrayCount,1000.2f);
}
cout<<"Use SSE: "<<t.End()<<"ms"<<endl;
t.Reset();
for (int i=0;i!=100000;i++)
{
f2(Array,ArrayCount,1000.2f);
}
cout<<"Don't Use SSE: "<<t.End()<<"ms"<<endl;
system("pause");
return 0;
}
作为一个SSE初学者,我在写这个算法时遇到了以下问题:
1)什么是SSE?----简单地说,他是一组CPU指令集,VC++.net为我们提供了很方便的指令C函数级的封装和C格式数据类型,我们只需像平时写C++代码一样定义变量、调用函数就可以很好的应用SSE指令了。
参考:http://blog.csdn.net/miss_acha/article/details/7403446
2)什么是“__m128”类型?----SSE算法标准的数据类型。
它的定义参考:http://blog.csdn.net/miss_acha/article/details/7403446
3)函数调用方式?----这实际上是在看网上的一篇相关文章时接触到的,就看了看,觉得还不错。
参考:http://blog.csdn.net/miss_acha/article/details/7402728
4)内存对齐问题是怎么回事?
参考:http://blog.csdn.net/miss_acha/article/details/7402896
5)memset函数的使用?