+AVX(AdvancedVectorExtensions)是SSE(StreamingSIMDExtensions)的延伸架构,此架构将寄存器从128位提升到256位。+只有VS2010和gcc4.6及更高版本的编译器,配合第二代Corei3/i5/i7及更新型号的处理器才支持高级向量扩展指令函数。+支持更多运算符号__m256_mm256_blend_ps(__m256a,__m256b,constintmask)+支持更多数学函数__m256_mm256_ceil_ps(__m256a)+支持数据交叉运算__m256_mm256_addsub_ps(__m256a,__m256b)+支持三操作数运算__m256_mm256_fmadd_ps(__m256a,__m256b,__m256c)+使用SSE和AVX所提供的__m128和__m256数据类型需要标准整型支持。+VS2010和gcc3.0及更高版本的编译器提供C99标准整型头文件stdint.h。+声明变量需要使用__declspec(align(N))或__attribute__(aligned(N))扩展属性。+分配内存需要使用_mm_malloc(size,align)和_mm_free(ptr)函数(malloc.h)。#ifndefALIGN#if!defined(__GNU__)/*Win*/#defineALIGN(n)\__declspec(align(n))#else/*Linux*/#defineALIGN(n)\__attribute__(aligned(n))#endif#endiffloat*ptr=_mm_malloc(8,32);_mm_free(ptr);+使用SSE或AVX需要在编译器中添加/arch:SSE(-msse)或/arch:AVX(-mavx)选项来启用指令集。+使用SSE或AVX需要在编译器中预定义__SSE__或__AVX__宏来声明函数集。+在编译时检测编译器是否支持SSE或AVX需要包含zintrin.h头文件,支持则定义INTRIN_SSE或INTRIN_AVX宏。+在运行时检测处理器是否支持SSE和AVX需要包含ccpuid.h头文件,使用simd_sse_level和simd_avx_level函数判断其版本。#ifdefINTRIN_SSEif(simd_sse_level(NULL)=SIMD_SSE_1){//RUNYOURSSECODECDTWoDTW;oDTW.GetDTWPath_SSE(&oUserData,&oTempData,MFCC_LIMIT);}#elifINTRIN_AVXif(simd_avx_level(NULL)=SIMD_AVX_1){//RUNYOURAVXCODECDTWoDTW;oDTW.GetDTWPath_AVX(&oUserData,&oTempData,MFCC_LIMIT);}#endif