英特尔® 集成性能基元(Intel® IPP)函数面向英特尔® 高级矢量扩展指令集(Intel® AVX)而优化

  • 下表列出了英特尔® IPP 7.0.2 函数库版本提供的英特尔® AVX 支持。
  • 7.0 函数库 32位和 64 位版本提供经优化的英特尔® AVX 代码。
  • 6.1 函数库对英特尔® AVX 的支持非常有限;如果您打算在英特尔® AVX 平台上使用英特尔® IPP,您应升级至采用英特尔® IPP 函数库 7.0 版本。

英特尔® AVX(英特尔® 高级矢量扩展指令集)是一套针对 SSE 的 256 位扩展指令集,可为浮点密集型应用提供更高的性能。英特尔® AVX 向现有英特尔® SIMD 指令集(基于 SSE)添加新函数,并采用更紧凑的 SIMD 编码格式。AVX 中的大量(200 多个)英特尔 SSEx 指令经过升级,可充分利用多种特性,如各自不同的目的操作数和灵活的内存对齐等。约 100 个原来的 128 位英特尔 SSEx 指令可用于处理 256 位矢量数据。此外,该版本还添加了约 100 个全新的数据处理和算法运算。这些运算不包含于传统英特尔 SSEx SIMD 指令集内。

英特尔® AVX 的主要优势在于:

  • 支持更广泛的矢量数据(多至 256 位)。
  • 高效的指令编码模式,支持3运算指令或 4 运算指令语法。
  • 灵活的编程环境--从分支处理到宽松的内存对齐要求。
  • 全新的数据处理和算术计算基元,包括播送、乱序、融合乘加等



ippGetCpuFeatures() 报告与 SIMD 特性有关可应用于您的处理器的信息。此外,ippGetCpuType() 检测您系统中的处理器类型。ippCpuAVX 返回值表示您的处理器支持英特尔® AVX 指令集。这些函数将在 ippcore.h 中声明。

隐藏 ippGetCpuFeatures()(采用 ippCPUID_AVX (0x0100))返回的值,以确定英特尔® AVX SIMD 指令集是否获得您的处理器的支持(ippGetCpuFeatures() 和 ippCPUID_AVX 为 TRUE)。为了确定您的操作系统是否还支持英特尔® AVX 指令(保存扩展的 SIMD 寄存器)、隐藏 ippGetCpuFeatures()(采用 ippAVX_ENABLEDBYOS (0x0200))返回的值。在您的应用使用英特尔® AVX SIMD 指令前,必须满足两种条件( CPU 和操作系统支持)。



英特尔® 函数库已面向各种 SIMD 指令集而优化。自动“分派”检测运行处理器上可用的 SIMD 指令集,并为该处理器选择最佳的 SIMD 指令。如欲了解更多有关分派的更多信息,请参阅了解英特尔® IPP 函数库中的 CPU 分派

英特尔® IPP 函数库中的英特尔® AVX 优化包含“人工优化”和“编译器调试”函数 - 直接针对英特尔® AVX 指令集而优化的代码。由于英特尔® IPP 函数库中包含大量基元,因此不可能针对一次产品发行或更新期间内的英特尔® AVX 指令集所代表的大量新指令,来直接优化每个英特尔® IPP 函数(处理器特定优化可能还需要考虑高速缓存大小和内核/线程的数量)。因此,下表中的函数表示全新英特尔® AVX 指令所带来的最大优势,或是英特尔® IPP 客户最广泛使用的函数。

如果您有一些特定的英特尔® IPP 函数但下表没有列明,如果您希望将它们添加至未来 AVX 优化的优先级列表中,请在 IPP 论坛上创建一条线程,说明您希望将哪些函数添加至 AVX 优化优先级列表中。

随着面向英特尔® AVX 直接优化的函数在函数库每个新版本或更新版本中的应用,这些函数将添加至下表中。

下表中使用的规则支持多个类似的函数在一行上指示:

  • {x} – 括号包含所需(函数名称)元素。
  • [x] – 方括号内包含可选(函数名称)元素。
  • | - 垂直线表示可选或所需元素集中独一无二的选择。
  • {x|y|z} – 函数名称中所需元素内三个互斥选择示例。
  • [x|y|z] – 函数名称中可选元素内三个互斥选择示例。

信号处理

ippsAbs_{16s|32s|32f|64f}[_I] 
ippsAdd_{32f|32fc|64f|64fc}[_I] 
ippsAddC_{32f|64f}[_I] 
ippsAddProductC_32f 
ippsAddProduct_{32fc|64f|64fc} 
ippsAutoCorr_{32f|64f}
ippsConv_32f 
ippsConvert_{8s|8u|16s|16u|32s|64f}32f 
ippsConvert_{32s|32f}64f 
ippsConvert_32f{8s|8u|16s|16u}_Sfs 
ippsConvert_64f32s_Sfs 
ippsCopy_{16s|32s|32f|64f} 
ippsCrossCorr_{32f|64f} 
ippsDFTFwd_CToC_{32f|32fc|64f|64fc} 
ippsDFTFwd_RTo{CCS|Pack|Perm}_{32f|64f} 
ippsDFTInv_CCSToR_{32f|64f} 
ippsDFTInv_CToC_{32f|32fc|64f|64fc} 
ippsDFTInv_{Pack|Perm}ToR_{32f|64f} 
ippsDFTOutOrd{Fwd|Inv}_CToC_{32fc|64fc} 
ippsDiv[C]_32f[_I] 
ippsDotProd_32f64f 
ippsFFTFwd_CToC_{32f|32fc|64f|64fc}[_I] 
ippsFFTFwd_RTo{CCS|Pack|Perm}_{32f|64f}[_I] 
ippsFFTInv_CCSToR_{32f|64f}[_I] 
ippsFFTInv_CToC_{32f|32fc|64f|64fc}[_I] 
ippsFFTInv_{Pack|Perm}ToR_{32f|64f}[_I] 
ippsFIR64f_32f[_I] 
ippsFIR64fc_32fc[_I] 
ippsFIRLMS_32f 
ippsFIR_{32f|32fc|64f|64fc}[_I] 
ippsIIR32fc_16sc_[I]Sfs 
ippsIIR64fc_32fc[_I] 
ippsIIR_32f[_I] 
ippsLShiftC_16s_I 
ippsMagnitude_16sc_Sfs 
ipps{Min|Max}Indx_{32f|64f} 
ippsMul_32fc[_I] 
ippsMul[C]_{32f|32fc|64f|64fc}[_I] 
ippsMulC_64f64s_ISfs 
ipps{Not|Or}_8u 
ippsPhase_{16s|16sc|32sc}_Sfs 
ippsPowerSpectr_{32f|32fc} 
ippsRShiftC_16u_I 
ippsSet_{8u|16s|32s} 
ippsSqr_{8u|16s|16u|16sc}_[I]Sfs 
ippsSqr_{32f|32fc|64f|64fc}[_I] 
ippsSqrt_32f[_I] 
ippsSub_{32f|32fc|64f|64fc}[_I] 
ippsSubC_{32f|32fc|64f|64fc}[_I] 
ippsSubCRev_{32f|32fc|64f|64fc}[_I] 
ippsSum_{32f|64f} 
ippsThreshold_{32f|GT_32f|LT_32f}_[_I] 
ippsThreshold_{GT|LT}Abs_{32f|64f}[_I] 
ippsThreshold_GTVal_32f[_I] 
ippsWinBartlett_{32f|32fc|64f|64fc}[_I] 
ippsWinBlackman_{32f|64f|64fc}[_I] 
ippsWinBlackmanOpt_{32f|64f|64fc}[_I] 
ippsWinBlackmanStd_{32f|64f|64fc}[_I] 
ippsWinKaiser_{32f|64f|64fc}[_I] 
ippsZero_{8u|16s|32f}

 

SPIRAL (GEN) 函数

ippgDFTFwd_CToC_8_64fc ippgDFTFwd_CToC_12_64fc 
ippgDFTFwd_CToC_16_{32fc|64fc}
ippgDFTFwd_CToC_20_64fc
ippgDFTFwd_CToC_24_64fc
ippgDFTFwd_CToC_28_64fc 
ippgDFTFwd_CToC_32_{32fc|64fc}
ippgDFTFwd_CToC_36_64fc
ippgDFTFwd_CToC_40_64fc
ippgDFTFwd_CToC_44_64fc 
ippgDFTFwd_CToC_48_{32fc|64fc}
ippgDFTFwd_CToC_52_64fc 
ippgDFTFwd_CToC_56_64fc 
ippgDFTFwd_CToC_60_64fc 
ippgDFTFwd_CToC_64_{32fc|64fc} 
ippgDFTInv_CToC_8_64fc 
ippgDFTInv_CToC_12_64fc 
ippgDFTInv_CToC_16_{32fc|64fc} 
ippgDFTInv_CToC_20_64fc 
ippgDFTInv_CToC_24_64fc 
ippgDFTInv_CToC_28_64fc 
ippgDFTInv_CToC_32_{32fc|64fc} 
ippgDFTInv_CToC_36_64fc 
ippgDFTInv_CToC_40_64fc 
ippgDFTInv_CToC_44_64fc 
ippgDFTInv_CToC_48_{32fc|64fc} 
ippgDFTInv_CToC_52_64fc 
ippgDFTInv_CToC_56_64fc 
ippgDFTInv_CToC_60_64fc 
ippgDFTInv_CToC_64_{32fc|64fc}

 

音频编码

iippsDeinterleave_32f

 

语音编码

ippsAdaptiveCodebookSearch_RTA_32f
ippsFixedCodebookSearch_RTA_32f
ippsFixedCodebookSearchRandom_RTA_32f
ippsHighPassFilter_RTA_32f
ippsLSPQuant_RTA_32f
ippsLSPToLPC_RTA_32f
ippsPostFilter_RTA_32f_I
ippsQMFDecode_RTA_32f
ippsSynthesisFilter_G729_32f

 

色彩转换

ippiRGBToHLS_8u_AC4R
ippiRGBToHLS_8u_C3R

 

逼真渲染

ipprCastEye_32f
ipprCastShadowSO_32f
ipprDot_32f_P3C1M
ipprHitPoint3DEpsM0_32f_M
ipprHitPoint3DEpsS0_32f_M
ipprMul_32f_C1P3IM

 

计算机视觉

ippiEigenValsVecs_[8u]32f_C1R 
ippiFilterGaussBorder_32f_C1R 
ippiMinEigenVal_[8u]32f_C1R 
ippiNorm_Inf_{8u|8s|16u|32f}_C{1|3C}MR 
ippiNorm_L1_{8u|8s|16u|32f}_C{1|3C}MR 
ippiNorm_L2_{8u|8s|16u|32f}_C{1|3C}MR 
ippiNormRel_L2_32f_C3CMR 
ippiUpdateMotionHistory_[8u|16u]32f_C1IR

 

图像处理

ippiAddC_32f_C1[I]R 
ippiConvert_32f* 
ippiCopy_16s* 
ippiCopy_8u* 
ippiConvFull_32f_{AC4|C1|C3}R 
ippiConvValid_32f_{AC4|C1|C3}R 
ippiCrossCorrFull_NormLevel_16u32f_{AC4|C1|C3|C4}R 
ippiCrossCorrFull_NormLevel_32f_{AC4|C1|C3|C4}R 
ippiCrossCorrFull_NormLevel_64f_C1R 
ippiCrossCorrFull_NormLevel_8s32f_{AC4|C1|C3|C4}R 
ippiCrossCorrFull_NormLevel_8u32f_{AC4|C1|C3|C4}R 
ippiCrossCorrFull_NormLevel_8u_{AC4|C1|C3|C4}RSfs 
ippiCrossCorrFull_Norm_16u32f_{AC4|C1|C3|C4}R 
ippiCrossCorrFull_Norm_32f_{AC4|C1|C3|C4}R 
ippiCrossCorrFull_Norm_8s32f_{AC4|C1|C3|C4}R 
ippiCrossCorrFull_Norm_8u32f_{AC4|C1|C3|C4}R 
ippiCrossCorrFull_Norm_8u_{AC4|C1|C3|C4}RSfs 
ippiCrossCorrSame_NormLevel_16u32f_{AC4|C1|C3|C4}R 
ippiCrossCorrSame_NormLevel_32f_{AC4|C1|C3|C4}R 
ippiCrossCorrSame_NormLevel_8s32f_{AC4|C1|C3|C4}R 
ippiCrossCorrSame_NormLevel_8u32f_{AC4|C1|C3|C4}R 
ippiCrossCorrSame_NormLevel_8u_{AC4|C1|C3|C4}RSfs 
ippiCrossCorrSame_Norm_16u32f_{AC4|C1|C3|C4}R 
ippiCrossCorrSame_Norm_32f_{AC4|C1|C3|C4}R 
ippiCrossCorrSame_Norm_8s32f_{AC4|C1|C3|C4}R 
ippiCrossCorrSame_Norm_8u32f_{AC4|C1|C3|C4}R 
ippiCrossCorrSame_Norm_8u_{AC4|C1|C3|C4}RSfs 
ippiCrossCorrValid_{8u32f|8s32f|16u32f|32f}_C1R 
ippiCrossCorrValid_NormLevel_16u32f_{AC4|C1|C3|C4}R 
ippiCrossCorrValid_NormLevel_32f_{AC4|C1|C3|C4}R 
ippiCrossCorrValid_NormLevel_64f_C1R 
ippiCrossCorrValid_NormLevel_8s32f_{AC4|C1|C3|C4}R 
ippiCrossCorrValid_NormLevel_8u32f_{AC4|C1|C3|C4}R 
ippiCrossCorrValid_NormLevel_8u_{AC4|C1|C3|C4}RSfs 
ippiCrossCorrValid_Norm_16u32f_{AC4|C1|C3|C4}R 
ippiCrossCorrValid_Norm_32f_{AC4|C1|C3|C4}R 
ippiCrossCorrValid_Norm_8s32f_{AC4|C1|C3|C4}R 
ippiCrossCorrValid_Norm_8u32f_{AC4|C1|C3|C4}R 
ippiCrossCorrValid_Norm_8u_{AC4|C1|C3|C4}RSfs 
ippiDCT8x8FwdLS_8u16s_C1R 
ippiDCT8x8Fwd_16s_C1[I|R] 
ippiDCT8x8Fwd_32f_C1[I] 
ippiDCT8x8Fwd_8u16s_C1R 
ippiDCT8x8InvLSClip_16s8u_C1R 
ippiDCT8x8Inv_16s8u_C1R 
ippiDCT8x8Inv_16s_C1[I|R] 
ippiDCT8x8Inv_2x2_16s_C1[I] 
ippiDCT8x8Inv_32f_C1[I] 
ippiDCT8x8Inv_4x4_16s_C1[I] 
ippiDCT8x8Inv_A10_16s_C1[I] 
ippiDCT8x8To2x2Inv_16s_C1[I] 
ippiDCT8x8To4x4Inv_16s_C1[I] 
ippiDFTFwd_CToC_32fc_C1[I]R 
ippiDFTFwd_RToPack_32f_{AC4|C1|C3|C4}[I]R 
ippiDFTFwd_RToPack_8u32s_{AC4|C1|C3|C4}RSfs 
ippiDFTInv_CToC_32fc_C1[I]R 
ippiDFTInv_PackToR_32f_{AC4|C1|C3|C4}[I]R 
ippiDFTInv_PackToR_32s8u_{AC4|C1|C3|C4}RSfs 
ippiDilate3x3_32f_C1[I]R 
ippiDilate3x3_64f_C1R 
ippiDivC_32f_C1[I]R 
ippiDiv_32f_{C1|C3}[I]R 
ippiDotProd_32f64f_{C1|C3}R 
ippiErode3x3_64f_C1R 
ippiFFTFwd_CToC_32fc_C1[I]R 
ippiFFTFwd_RToPack_32f_{AC4|C1|C3|C4}[I]R 
ippiFFTFwd_RToPack_8u32s_{AC4|C1|C3|C4}RSfs 
ippiFFTInv_CToC_32fc_C1[I]R 
ippiFFTInv_PackToR_32f_{AC4|C1|C3|C4}[I]R 
ippiFFTInv_PackToR_32s8u_{AC4|C1|C3|C4}RSfs 
ippiFilter_32f_{C1|C3|C4}R 
ippiFilter_32f_AC4R 
ippiFilter_64f_{C1|C3}R 
ippiFilter32f_{8s|8u|16s|16u|32s}_C{1|3|4}R 
ippiFilter32f_{8u|16s|16u}_AC4R 
ippiFilter32f_{8s|8u}16s_C{1|3|4}R 
ippiFilterBox_8u_{C1|C3}R 
ippiFilterBox_32f_{C1|C4|AC4}R 
ippiFilterColumn32f_{8u|16s|16u}_{C1|C3|C4|AC4}R 
ippiFilterColumn_32f_{C1|C3|C4|AC4}R 
ippiFilterGauss_32f_{C1|C3}R 
ippiFilterHipass_32f_{C1|C3|C4|AC4}R 
ippiFilterLaplace_32f_{C1|C3|C4|AC4}R 
ippiFilterLowpass_32f_{C1|C3|AC4}R 
ippiFilterMax_32f_{C1|C3|C4|AC4}R 
ippiFilterMedian_32f_C1R 
ippiFilterMin_32f_{C1|C3|C4|AC4}R 
ippiFilterRow_32f_{C1|C3|C4|AC4}R 
ippiFilterRow32f_{8u|16s|16u}_{C1|C3|C4|AC4}R 
ippiFilterSobelHoriz_32f_{C1|C3}R 
ippiFilterSobelVert_32f_{C1|C3}R 
ippiMean_32f_{C1|C3}R 
ippiMulC_32f_C1[I]R 
ippiMul_32f_{C1|C3|C4}[I]R 
ippiResizeSqrPixel_{32f|64f}_{C1|C3|C4|AC4}R 
ippiResizeSqrPixel_{32f|64f}_{P3|P4}R 
ippiSqrDistanceFull_Norm_16u32f_{AC4|C1|C3|C4}R 
ippiSqrDistanceFull_Norm_32f_{AC4|C1|C3|C4}R 
ippiSqrDistanceFull_Norm_8s32f_{AC4|C1|C3|C4}R 
ippiSqrDistanceFull_Norm_8u32f_{AC4|C1|C3|C4}R 
ippiSqrDistanceFull_Norm_8u_{AC4|C1|C3|C4}RSfs 
ippiSqrDistanceSame_Norm_16u32f_{AC4|C1|C3|C4}R 
ippiSqrDistanceSame_Norm_32f_{AC4|C1|C3|C4}R 
ippiSqrDistanceSame_Norm_8s32f_{AC4|C1|C3|C4}R 
ippiSqrDistanceSame_Norm_8u32f_{AC4|C1|C3|C4}R 
ippiSqrDistanceSame_Norm_8u_{AC4|C1|C3|C4}RSfs 
ippiSqrDistanceValid_Norm_16u32f_{AC4|C1|C3|C4}R 
ippiSqrDistanceValid_Norm_32f_{AC4|C1|C3|C4}R 
ippiSqrDistanceValid_Norm_8s32f_{AC4|C1|C3|C4}R 
ippiSqrDistanceValid_Norm_8u32f_{AC4|C1|C3|C4}R 
ippiSqrDistanceValid_Norm_8u_{AC4|C1|C3|C4}RSfs 
ippiSqrt_32f_C1R 
ippiSqrt_32f_C3IR 
ippiSubC_32f_C1[I]R 
ippiSub_32f_{C1|C3|C4}[I]R 
ippiSum_32f_C{1|3}R 
ippiTranspose_32f_C1R

 

图像压缩

ippiPCTFwd_JPEGXR_32f_C1IR 
ippiPCTFwd16x16_JPEGXR_32f_C1IR 
ippiPCTFwd8x16_JPEGXR_32f_C1IR 
ippiPCTFwd8x8_JPEGXR_32f_C1IR 
ippiPCTInv_JPEGXR_32f_C1IR_128 
ippiPCTInv16x16_JPEGXR_32f_C1IR 
ippiPCTInv8x16_JPEGXR_32f_C1IR 
ippiPCTInv8x8_JPEGXR_32f_C1IR

 

未直接面向 AVX 而优化的那些函数(即,未出现在表中的函数)已利用英特尔编译器“xG”切换(支持 AVX 优化)得到编译。通过遵循 AVX ABI(应用二级制接口)特性还可进一步提升性能。该特性在具有 AVX 代码的任何函数后插入特定的 AVX“vzeroupper”,以避免任意 AVX 的转换处罚。

对于那些未直接面向 AVX 而优化的函数,g9/e9 函数库利用来自之前兼容的 SSE 优化的函数优化,如,面向 p8/y8 函数库调试的优化和之前的 SIMD 优化(如,SSE4.x、AES-NI 和 SSE2/3)。上表中未列出的函数将包括最高等级直接优化的代码(基于 AES-NI、SSE4.x、SSSE3、SSE3 和 SSE2 SIMD 指令集,如适用)。

如欲了解有关 g9/e9 优化层和英特尔® IPP 函数库中英特尔 AVX 的更多信息,请参阅Intel® 64 架构用户指南中面向 Windows* 操作系统的英特尔® 集成性能基元

如欲了解更多信息,请参阅“如何面向英特尔® AVX 进行编译”,并访问Intel Parallel Studio 网站,了解有关开发、调试和优化多线程应用可用工具的更多信息。

优化通知

英特尔® 编译器\相关库和相关开发工具可能包含或使用针对英特尔® 和非英特尔微处理器中都存在的指令集(例如 SIMD 指令集)实现优化的选项,不过面向非英特尔微处理器的优化程度可能稍差一些。此外,部分面向英特尔编译器的编译器选项(包括并非英特尔微架构专用的选项)也为英特尔微处理器保留了下来。如欲获得有关英特尔编译器选项包括指令集和相关特定微处理器的详细说明,请参阅“编译器选项”下的“英特尔® 编译器用户和参考指南”。英特尔® 编译器产品中的大多数库例程面向英特尔微处理器的优化程度要高于其它微处理器。英特尔® 编译器产品中的编译器和库可为英特尔和英特尔兼容微处理器提供优化特性,具体取决于您所选择的选项以及代码和其它因素。您将能够在英特尔微处理器上获得额外性能。

英特尔® 编译器、相关库和相关开发工具针对非英特尔微处理器的优化程度可能与英特尔微处理器相同或不同。这些优化特性包括英特尔® SIMD 流指令扩展 2(英特尔® SSE2)、英特尔® SIMD 流指令扩展 3(英特尔® SSE3)和追加 SIMD 流指令扩展 3(英特尔® SSSE3)指令集以及其它优化性能。对于在非英特尔制造的微处理器上进行的优化,英特尔不对相应的可用性、功能或有效性提供担保。该产品中依赖于处理器的优化仅适用于英特尔微处理器。

虽然英特尔坚信我们的编译器和库是帮助您在英特尔® 和非英特尔微处理器上获得最佳性能的理想选择,不过仍建议您对其它编译器和库进行评估,选择最符合您要求的解决方案。我们希望通过致力于最大限度提升所有编译器或库的性能来赢得您的青睐,如果您发现我们存在不足之处,欢迎您指正。

通知版本 #20101101

Per informazioni più dettagliate sulle ottimizzazioni basate su compilatore, vedere il nostro Avviso sull'ottimizzazione.