`
- 浏览:
269785 次
- 性别:
- 来自:
沈阳
-
为了方便对比速度,我会用常归方法和SSE优化两种写法写出,并会用一个测试速度的类CTimer来进行计时。 这个算法是对一组float值进行放大,函数ScaleValue1是使用SSE指令优化的,函数ScaleValue2则没有。我们用10000个元素的float数组数据来测试这两个算法,每个算法运算10000遍,下面是测试程序和结果:
Use SSE:2.07543e+012秒
Not Use SSE:-2.5293e+012秒
请按任意键继续. . .
测试代码如下:
/******test.cpp*******/
#include <xmmintrin.h>
#include<iostream>
#include <windows.h>
using namespace std;
class CTimer
{
public:
__forceinline CTimer( void )
{
QueryPerformanceFrequency( &m_Frequency );
QueryPerformanceCounter( &m_StartCount );
}
__forceinline void Reset( void )
{
QueryPerformanceCounter( &m_StartCount );
}
__forceinline double End( void )
{
static __int64 nCurCount;
QueryPerformanceCounter( (PLARGE_INTEGER)&nCurCount );
return double( nCurCount * ( *(__int64*)&m_StartCount ) ) / double( *(__int64*)&m_Frequency );
}
private:
LARGE_INTEGER m_Frequency;
LARGE_INTEGER m_StartCount;
};
void ScaleValue1( float *pArray, DWORD dwCount, float fScale )
{
DWORD dwGroupCount = dwCount / 4;
__m128 e_Scale = _mm_set_ps1( fScale );
for ( DWORD i = 0; i < dwGroupCount; i++ )
{
*(__m128*)( pArray + i * 4 ) = _mm_mul_ps( *(__m128*)( pArray + i * 4 ), e_Scale );
}
}
void ScaleValue2( float *pArray, DWORD dwCount, float fScale )
{
for ( DWORD i = 0; i < dwCount; i++ )
{
pArray[i] *= fScale;
}
}
#define ARRAYCOUNT 10000
int __cdecl main()
{
float __declspec(align(16)) Array[ARRAYCOUNT];
memset( Array, 0, sizeof(float) * ARRAYCOUNT );
CTimer t;
double dTime;
t.Reset();
for ( int i = 0; i < 100000; i++ )
{
ScaleValue1( Array, ARRAYCOUNT, 1000.0f );
}
dTime = t.End();
cout << "Use SSE:" << dTime << "秒" << endl;
t.Reset();
for ( int i = 0; i < 100000; i++ )
{
ScaleValue2( Array, ARRAYCOUNT, 1000.0f );
}
dTime = t.End();
cout << "Not Use SSE:" << dTime << "秒" << endl;
system( "pause" );
return 0;
}
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
4. **循环展开**:通过增加循环次数,使得每个循环内能处理更多的数据,充分发挥SSE并行处理的优势。 5. **正确使用条件分支**:避免在SSE处理路径中使用条件分支,因为分支预测错误可能导致性能下降。可以使用条件...
### x86指令集简介与SSE详解 #### 一、x86指令集概述 x86指令集是Intel公司为其微处理器所设计的一套机器语言指令集,最初为Intel 8086 CPU而设计。随着技术的发展,x86架构逐渐成为个人计算机中最广泛使用的指令...
#### 二、SSE4特点与优势 1. **增强多媒体处理能力**:SSE4引入了一系列新指令,用于改善视频解码、图像处理和音频处理等多媒体应用的性能。 2. **提高通用计算效率**:除了多媒体处理外,SSE4还通过增加通用计算...
在实现淡入淡出电子相册时,多核技术可以让每个核心独立处理一部分图片的转换工作,进一步提升处理速度,特别是在处理大量图片或者高分辨率图片时,多核的优势尤为明显。 具体实现上,程序可能会首先将图片按照一定...
1. **数据对齐**:为了充分利用SSE的优势,需要确保数据在内存中按16字节对齐,否则可能引起性能下降甚至错误。 2. **负载和存储指令**:正确使用SSE的负载和存储指令,避免不必要的数据转换和复制。 3. **并行度...
### MMX与SSE指令集简介 MMX(Multimedia eXtension),即多媒体扩展指令集,是Intel于1997年推出的一套用于增强多媒体和通信应用性能的指令集。它通过增加57条新的SIMD(单指令多数据)指令,利用了CPU内部的浮点...
6. **性能分析与优化**:如何通过编译器选项、代码调整和基准测试来最大化利用SSE的优势。 7. **密码学理论**:理解加密的数学基础,包括对称加密和非对称加密的区别,以及安全散列函数、密钥管理等。 通过深入...
**Intel SSE4编程参考** Intel SSE4(Streaming SIMD Extensions 4)是一组指令集扩展,设计用于增强处理器...在实际应用中,结合汇编语言和高级编程语言,充分利用SSE4的优势,可以实现计算密集型任务的性能最大化。
通过SSE优化,程序可以在不增加太多代码复杂性的情况下,充分利用多核CPU的优势。 然后是内嵌汇编的使用。内嵌汇编允许程序员在高级语言的函数中直接插入汇编代码,使得C/C++程序可以利用汇编的灵活性。在VS中,`__...
**优势**: - **并行处理**: 充分利用多核处理器的能力,将任务分配到不同的处理器核心上执行。 - **任务分解**: 可以将图像处理任务分解为多个子任务,每个子任务分配给不同的核心处理,从而加快整体处理速度。 - **...
例如,如果数据是浮点数,那么SSE会比MMX更有优势。 总的来说,MMX和SSE指令为大块内存拷贝提供了高效的解决方案,通过利用硬件的并行处理能力,显著提升了拷贝速度。在实际编程中,结合适当的优化技巧和并行化处理...
LTM4644是一款国际知名的高性能DC/DC转换器,而SSE1644则是国内自主设计的,旨在提供类似的性能,同时可能具备价格优势或者适应国内供应链的需求。 SSE1644ML/MB是该系列的主要型号,是一款四通道、每通道4A输出的...
它允许处理器在同一时钟周期内处理四个单精度浮点数或者两个双精度浮点数,极大地提升了数据并行处理效率,尤其在图形渲染、科学计算、音频处理等领域有着显著的优势。 本实例是一个C++程序,通过应用SSE指令集对...
本篇文章将深入探讨SIMD技术及其核心组成部分SSE(Streaming SIMD Extensions)指令集的应用与优势。我们将从SSE的基本概念出发,探讨如何布局数据以更好地适应SSE,并通过一个具体的例子——计算点积——来展示SSE...
SIMD,全称为Single Instruction Multiple Data,是一种在处理器架构中执行相同操作的并行处理技术。...开发者可以利用这个库,编写出运行在多种处理器平台上的高效代码,特别是在处理大数据集时,其优势更为明显。
《SSE电子相册:利用SSE4与多线程技术构建高效计算机体系结构应用...这个过程中,开发者不仅需要熟悉硬件级别的优化技术,还需要具备扎实的软件工程知识,才能在实际项目中充分发挥SSE4的优势,为用户带来优质的体验。
VT的功能、性能或其他优势也会因不同的硬件和软件配置而有所变化。 #### 三、SSE4指令集特点 1. **新增指令**:SSE4包括了大量新引入的指令,如整数操作、字符串处理、数据打包和解包等,极大地扩展了SSE家族的...