SSE小試牛刀(一)

1.介紹

    SSE絕對是優化神器之一,是由英特爾所提出的cpu指令集,具有Intel SSE指令集支持的處理器有8個128位的寄存器,每一個寄存器可以存放4個(32位)單精度的浮點數,SSE的英文全稱:Stream SIMD Extentions,而SIMD的英文全稱:Single Instruction Multiple Data。它的強悍地方在於,一道指令可以完成多個(一般是4個)數據的操作

    下面主要介紹一下,浮點型算術指令,其它的都類似,可以查看說明書://download.csdn.net/download/u013289254/11459202

    SSE的指令格式:

           第一部分爲指令的操作,可選擇項比較多,比如add,sub

           第二部分爲p或者s,分別表示爲packed(多個一起運算)或者scala(第一個運算)r;

           第三部分爲s,表示單精度浮點數

2.代碼

#include <iostream>
#include <windows.h>
#include <xmmintrin.h>

using namespace std;

void sse_mul(float *srcOne, float *srcTwo, float *dest, int size)
{
	int n = size >> 2;
	for (int i = 0; i < n; ++i)
	{
		*(__m128*)(dest + i * 4) = _mm_mul_ps(*(__m128*)(srcOne + i * 4), *(__m128*)(srcTwo + i * 4));
	}
}

void normal_mul(float *srcOne, float *srcTwo, float *dest, int size)
{
	for (int i = 0; i < size; ++i)
	{
		dest[i] = srcOne[i] * srcTwo[i];
	}
}

int main()
{
	int timeStart = 0, timeEnd = 0;
	const int size = 10000;

	_MM_ALIGN16 float *srcOne = (_MM_ALIGN16 float*)_mm_malloc(sizeof(float)*size, 16);
	_MM_ALIGN16 float *srcTwo = (_MM_ALIGN16 float*)_mm_malloc(sizeof(float)*size, 16);
	_MM_ALIGN16 float *dest = (_MM_ALIGN16 float*)_mm_malloc(sizeof(float)*size, 16);

	for (int i = 0; i < size; ++i){
		srcOne[i] = (float)i;
		srcTwo[i] = size - (float)i;
	}

	// for循環乘法
	timeStart = GetTickCount();
	for (int i = 0; i < size; ++i) {
		normal_mul(srcOne, srcTwo, dest, size);
	}
	timeEnd = GetTickCount();
	cout << "normal_mul test time is " << (timeEnd - timeStart) * 0.001 << endl;

	// SSE指令乘法
	timeStart = GetTickCount();
	for (int i = 0; i < size; ++i) {
		sse_mul(srcOne, srcTwo, dest, size);
	}
	timeEnd = GetTickCount();
	cout << "sse_mul test time is " << (timeEnd - timeStart) * 0.001 << endl;

	// 釋放內存
	_mm_free(srcOne);
	_mm_free(srcTwo);
	_mm_free(dest);

	system("pause");
	return 0;
}

    效果還是不錯的,見下面圖片:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章