加速计算技术---基于SSE/AVX指令集

基于指令集的加速是利用了SIMD(Single Instruction Stream, Multiple Data Stream单指令流多数据流操作)的思路,它可以一次指令操作多组数据。

#include <pmmintrin.h>//SSE
#include <immintrin.h>//AVX


        RecordTimer tm;
	tm.start();

	float sum_avg[10000000];
	for (int i = 0; i < 10000000; i++)
	{
		sum_avg[i] = i * 1.0 * i;
	}

	tm.end();
	double ticks = tm.getTick();
	std::cout <<"无并行计算:" << ticks << std::endl;//耗时 45.6397

	tm.start();
	float sum_avg2[10000000];
	__m128 m1;
	__m128* dst = (__m128*)sum_avg2;
	for (int i = 0; i < 10000000; i+=4)
	{
		m1 = _mm_set_ps(i+3, i + 2, i + 1, i);
		*dst = _mm_mul_ps(m1, m1);
		dst++;
	}
	tm.end();
	ticks = tm.getTick();
	std::cout << "并行计算1:" << ticks << std::endl;//耗时22.8161

	tm.start();
	float sum_avg3[10000000];
	__m256 m2;
	__m256* dst2 = (__m256*)sum_avg3;
	for (int i = 0; i < 10000000; i += 8)
	{
		m2 = _mm256_set_ps(i + 7, i + 6, i + 5, i + 4, i + 3, i + 2, i + 1, i); 
		*dst2 = _mm256_mul_ps(m2, m2);
		dst2++;
	}
	tm.end();
	ticks = tm.getTick();
	std::cout << "并行计算2:" << ticks << std::endl; //耗时10.7683

  上面是操作同一组数据测试得到的计算时间,可以发现,AVX > SSE > 未优化的。