この記事は、インテル® デベロッパー・ゾーンに掲載されている「Intel IPP support for Intel® AVX2」(http://software.intel.com/en-us/articles/haswell-support-in-intel-ipp) の日本語参考訳です。
第 4 世代インテル® Core™ プロセッサー (開発コード名: Haswell) は、2013 年にリリースされた新しい世代の x86 プロセッサー・マイクロアーキテクチャー (tock) です。Haswell の新しい命令は、幅広いアプリケーションと使用モデルを高速化します。こちらから『Intel® Advanced Vector Extensions Programming Reference』 (英語) をダウンロードできます。新しい命令セットは、Ivy Bridge (開発コード名) マイクロアーキテクチャーの命令を基に構築されており、デジタル乱数ジェネレーター、半精度浮動小数点 (float16) アクセラレーター、インテル® アドバンスト・ベクトル・エクステンション (インテル® AVX) 命令の拡張セットが含まれています。
新しい命令は次のように分類できます。
インテル® AVX2 – 整数型を 256 ビットの SIMD へ拡張: インテル® AVX2 の整数型は、商用のイメージ/ビデオ処理ワークロードでよく使われる映像データ処理に特に役立ちます。Haswell では、インテル® アドバンスト・ベクトル・エクステンション (インテル® AVX) の浮動小数点型とインテル® AVX2 の整数型の両方を利用できます。 |
ビット操作命令: 圧縮データベース、ハッシュ、大数演算、およびさまざまな汎用コードで役立ちます。 |
ギャザー命令: 隣接しないデータ要素を利用するベクトル化されたコードで便利です。Haswell のギャザー命令は、(インテル® AVX の条件付きロード/ストアと同様に) 安全性を確保するためマスクを採用しています。値の丸め操作や境界のアライメント、または同様の条件付き操作に適しています。 |
Any-to-Any 並べ替え: シャッフル操作に便利です。Haswell では、DWORD と QWORD がサポートされ、256 ビットのレジスター全体にわたって並べ替えを行うことができます。 |
ベクトル-ベクトルシフト: 新しいベクトルのシフト操作が追加されました。シフト量はベクトルによって制御されます。これは、要素ごとにシフト量が異なるベクトル化されたループで重要です。 |
浮動小数点の乗累算: ピーク FLOPS を大幅に向上し、超越関数の精度をさらに高めます。ハイパフォーマンス・コンピューティング、プロ品質の画像、顔検出など幅広い分野で利用できます。スカラー、128 ビット/256 ビットのパックド単精度/倍精度データ型を処理します。(これらの命令は、初期のインテル® AVX の仕様書で説明されているとおりです。) |
以下の関数は、Haswell の新しい命令を活用するように最適化されています。
ビデオ・コーディング
ippiSAD16x16_8u32s |
ippiDecodeCAVLCCoeffs_H264_1u16s |
ippiInterpolateBlock_H264_8u_P3P1R (8×8) |
ippiCopy_8u_C1R |
ippiTransformQuantFwd4x4_H264_16s_C1 |
ippiFilterDeblockingChroma_HorEdge_H264_8u_C1IR |
ippiSATD8x8_8u32s_C1R |
ippiReconstructLumaIntra8x8MB_H264_16s8u_C1R |
ippiSATD16x16_8u32s_C1R |
ippsSet_8u |
ippiInterpolateBlock_H264_8u_P3P1R (16×16) |
ippiDecodeExpGolombOne_H264_1u32s |
ippiSAD8x8_8u32s_C1R |
ippiInterpolateLuma_H264_8u_C1R |
ippiTransformQuantInvAddPred4x4_H264_16s_C1IR |
ippiFilterDeblockingChroma_HorEdge_H264_8u_C1IR |
ippiInterpolateBlock_H264_8u_P2P1R |
ippiReconstructLumaIntra4x4MB_H264_16s8u_C1R |
ippiFilterDeblockingLuma_VerEdge_H264_8u_C1IR |
ippiInterpolateChroma_H264_8u_C1R |
ippiFilterDeblockingLuma_HorEdge_H264_8u_C1IR |
JPEG
ippiDCTQuantFwd8x8LS_JPEG_8u16s_C1R |
ippiDCTQuantInv8x8LS_JPEG_16s8u_C1R |
データ圧縮
ippsDecodeHuff_BZ2_8u16u |
ippsDeflateHuff_8u |
ippsEncodeHuff_8u |
暗号化
ippsSHA256Update | ippsSHA512Update |
ippsHMACSHA256Update | ippsSHA512MessageDigest |
ippsSHA256MessageDigest | ippsHMACSHA512MessageDigest |
ippsHMACSHA256MessageDigest | ippsHMACSHA384MessageDigest |
ippsHMACSHA224MessageDigest |
コンピューター・ビジョン
ippiAbsDiff_8u_C1R |
ippiMean_StdDev_32f_C1R |
ippiMean_StdDev_8u_C1R |
カラー変換
ippiYCbCr420ToBGR_8u_P3C3R | ippiBGRToCbYCr422_709HDTV_8u_AC4C2R |
ippiYCbCr422ToBGR_8u_C2C3R | ippiYCbCr420ToBGR_709HDTV_8u_P3C4R |
ippiYCbCr422ToBGR_8u_C2C4R | ippiBGRToYCbCr420_709HDTV_8u_AC4P3R |
ippiCbYCr422ToBGR_709HDTV_8u_C2C3R | ippiBGRToYCbCr420_709CSC_8u_C3P3R |
ippiCbYCr422ToBGR_709HDTV_8u_C2C4R | ippiBGRToYCrCb420_709CSC_8u_C3P3R |
ippiBGRToCbYCr422_709HDTV_8u_C3C2R | ippiYCbCrToBGR_709CSC_8u_P3C3R |
ippiBGRToCbYCr422_8u_AC4C2R | ippiBGRToYCbCr422_8u_AC4C2R |
ippiBGRToYCbCr422_8u_C3C2R | ippiBGRToYCrCb420_8u_C3P3R |
ippiRGBToGray_8u_C3C1R | ippiCbYCr422ToBGR_8u_C2C4R |
ippiYCbCr422ToBGR555_8u16u_C2C3R | ippiYCbCr422ToBGR565_8u16u_C2C3R |
ippiYCbCr420ToBGR444_8u16u_P3C3R | ippiYCbCr420ToBGR555_8u16u_P3C3R |
ippiYCbCr420ToBGR565_8u16u_P3C3R | ippiYCbCr420ToBGR_709CSC_8u_P3C3R |
ippiBGRToYCbCr420_709CSC_8u_AC4P3R | ippiBGRToYCrCb420_709CSC_8u_AC4P3R |
ippiBGRToYCbCr420_709CSC_8u_C3P2R | ippiYCbCrToBGR_709CSC_8u_P3C4R |
ippiCbYCr422ToYCbCr422_8u_C2R | ippiCbYCr422ToYCbCr420_8u_C2P2R |
ippiCbYCr422ToYCrCb420_8u_C2P3R | ippiYCbCr420ToCbYCr422_8u_P2C2R |
ippiYCbCr422ToCbYCr422_8u_C2R | ippiYCbCr422ToYCbCr420_8u_C2P2R |
ippiYCbCr420ToYCbCr422_8u_P2C2R | ippiYCrCb420ToCbYCr422_8u_P3C2R |
ippiYCrCb420ToYCbCr422_8u_P3C2R |
イメージ処理
ippiAdd_32f_C1IR | ippiMinMax_16s_C1R |
ippiAdd_32f_C1R | ippiMinMax_32f_C1R |
ippiAdd_8u_C1RSfs | ippiMinMax_8u_C1R |
ippiAddC_16s_C1RSfs | ippiMirror_8u_C1R |
ippiAddC_32f_C1R | ippiMirror_8u_C1IR |
ippiAddC_8u_C1RSfs | ippiMirror_8u_C3R |
ippiAnd_8u_C1R | ippiMirror_8u_C3IR |
ippiAndC_16u_C1R | ippiMul_32f_C1R |
ippiCompareC_32f_C1R | ippiMulC_16s_C1RSfs |
ippiCompareC_8u_C1R | ippiMulC_8u_C1RSfs |
ippiConvert_16s8u_C1R | ippiNot_8u_C1R |
ippiConvert_16u32f_C1R | ippiOr_8u_C1R |
ippiConvert_16u8u_C1R | ippiScale_32f8u_C1R |
ippiConvert_32f16u_C1R | ippiSqrt_32f_C1R |
ippiConvert_32f8u_C1R | ippiSub_32f_C1R |
ippiConvert_8u16s_C1R | ippiSub_32f_C1IR |
ippiConvert_8u16u_C1R | ippiSub_8u_C1RSfs |
ippiConvert_8u32f_C1R | ippiSubC_32f_C1R |
ippiCountInRange_8u_C1R | ippiSum_32f_C1R |
ippiDCT8x8Fwd_16s_C1I | ippiSum_8u_C1R |
ippiDeinterlaceFilterCAVT_8u_C1R | ippiSwapChannels_8u_C3R |
ippiDilate3x3_8u_C1R | ippiZigzagInv8x8_16s_C1 |
ippiDiv_32f_C1R | ippiDCT8x8Inv_16s_C1 |
ippiDivC_32f_C1R | ippiDCT8x8Inv_16s_C1I |
ippiErode3x3_8u_C1R | ippiDCT8x8Inv_A10_16s_C1 |
ippiFilter_8u_C1R | ippiDCT8x8Inv_A10_16s_C1I |
ippiFilterMedian_8u_C1R | ippiAdd_8u_C3RSfs |
ippiMax_32f_C1R | ippiAdd_8u_C4RSfs |
ippiMax_8u_C1R | ippiAdd_8u_C1IRSfs |
ippiMaxIndx_32f_C1R | ippiAdd_8u_C3IRSfs |
ippiMean_32f_C1R | ippiAdd_8u_C4IRSfs |
ippiMean_8u_C1R | ippiAdd_16u_C1RSfs |
ippiAdd_16u_C3RSfs | ippiSub_16u_C4IRSfs |
ippiAdd_16u_C4RSfs | ippiSub_16s_C1RSfs |
ippiAdd_16u_C1IRSfs | ippiSub_16s_C3RSfs |
ippiAdd_16u_C3IRSfs | ippiSub_16s_C4RSfs |
ippiAdd_16u_C4IRSfs | ippiSub_16s_C1IRSfs |
ippiAdd_16u_AC4IRSfs | ippiSub_16s_C3IRSfs |
ippiAdd_16s_C1RSfs | ippiSub_16s_C4IRSfs |
ippiAdd_16s_C3RSfs | ippiSub_16sc_C1RSfs |
ippiAdd_16s_C4RSfs | ippiSub_16sc_C3RSfs |
ippiAdd_16s_C1IRSfs | ippiSub_16sc_C1IRSfs |
ippiAdd_16s_C3IRSfs | ippiSub_16sc_C3IRSfs |
ippiAdd_16s_C4IRSfs | ippiSub_32sc_C1RSfs |
ippiAdd_16sc_C1RSfs | ippiSub_32sc_C3RSfs |
ippiAdd_16sc_C3RSfs | ippiSub_32sc_C1IRSfs |
ippiAdd_16sc_C1IRSfs | ippiSub_32sc_C3IRSfs |
ippiAdd_16sc_C3IRSfs | ippiSubC_8u_C1RSfs |
ippiAdd_32sc_C1RSfs | ippiSubC_8u_C1IRSfs |
ippiAdd_32sc_C3RSfs | ippiSubC_16u_C1RSfs |
ippiAdd_32sc_C1IRSfs | ippiSubC_16u_C1IRSfs |
ippiAdd_32sc_C3IRSfs | ippiSubC_16s_C1RSfs |
ippiAddC_8u_C3RSfs | ippiSubC_16s_C1IRSfs |
ippiAddC_8u_C4RSfs | ippiSubC_16sc_C1RSfs |
ippiAddC_8u_C1IRSfs | ippiSubC_16sc_C1IRSfs |
ippiAddC_8u_C3IRSfs | ippiSubC_32sc_C1RSfs |
ippiAddC_16u_C1RSfs | ippiSubC_32sc_C1IRSfs |
ippiAddC_16u_C1IRSfs | ippiSqrt_32f_C3R |
ippiAddC_16s_C1IRSfs | ippiSqrt_32f_AC4R |
ippiAddC_16sc_C1RSfs | ippiSqrt_32f_C1IR |
ippiAddC_16sc_C1IRSfs | ippiSqrt_32f_C3IR |
ippiAddC_32sc_C1RSfs | ippiSqrt_32f_AC4IR |
ippiAddC_32sc_C1IRSfs | ippiSqrt_32f_C4IR |
ippiSub_8u_C3RSfs | ippiMinMax_32f_C3R |
ippiSub_8u_C4RSfs | ippiMinMax_32f_C4R |
ippiSub_8u_C1IRSfs | ippiMinMax_32f_AC4R |
ippiSub_8u_C3IRSfs | ippiAnd_8u_C3R |
ippiSub_8u_C4IRSfs | ippiAnd_8u_C4R |
ippiSub_16u_C1RSfs | ippiNot_8u_C3R |
ippiSub_16u_C3RSfs | ippiNot_8u_C4R |
ippiSub_16u_C4RSfs | ippiOr_8u_C3R |
ippiSub_16u_C1IRSfs | ippiOr_8u_C4R |
ippiSub_16u_C3IRSfs | ippiXorC_8u_C1R |
ippiXorC_8u_C1IR | ippiFilterMedianVerrt_f8u_C3R, |
ippiScale_32f8u_C3R | ippiFilterMedianVerrt_f8u_C4R |
ippiScale_32f8u_C4R | ippiMulC_16s_C1IRSfs |
ippiFilterMedianHoriz_f8u_C1R, | ippiScale_32f8u_C3R |
ippiFilterMedianVerrt_f8u_C1R, | ippiScale_32f8u_C4R |
信号処理
ippsAbs_32f | ippsSubC_16s_Sfs |
ippsAdd_16s_Sfs | ippsSubC_16s_I |
ippsAdd_32f | ippsSubC_16s_ISfs |
ippsAdd_32s_Sfs | ippsSubC_16sc_Sfs |
ippsAddC_16s_Sfs | ippsSubC_16sc_ISfs |
ippsAddC_32f | ippsSubC_32s_Sfs |
ippsAddProductC_32f | ippsSubC_32s_ISfs |
ippsConvert_16s32f | ippsSubC_32sc_Sfs |
ippsConvert_32f16s_Sfs | ippsSubC_32sc_ISfs |
ippsConvert_32f32s_Sfs | ippsMulC_8u_Sfs |
ippsConvert_32f64f | ippsDivC_8u_Sfs |
ippsConvert_32s32f_Sfs | ippsFIR64fc_16sc_Sfs |
ippsConvert_64f32f | ippsFIR64fc_32sc_Sfs |
ippsCopy_16s | ippsFIR64fc_32fc |
ippsCopy_32f | ippsFIR_32fc |
ippsCopy_32fc | ippsSum_32f |
ippsCopy_32s | ippsSum_32s_Sfs |
ippsCopy_64f | ippsSum_64f |
ippsCopy_8u | ippsSwapBytes_16u |
ippsDiv_32f | ippsMin_32s |
ippsDivC_32f | ippsMin_16s |
ippsDivC_64f | ippsMaxIndx_32s |
ippsDotProd_32f | ippsLShiftC_16u |
ippsExp_32f | ippsLShiftC_16u_I |
ippsFFTFwd_CToC_32fc | ippsLShiftC_16s_I |
ippsFFTFwd_RToCCS_32f | ippsAddC_32sc |
ippsFIR_32f | ippsAdd_8u_Sfs |
ippsFlip_32f | ippsAdd_8u_ISfs |
ippsLn_32f | ippsAdd_16u |
ippsLShiftC_16s | ippsAdd_16u_Sfs |
ippsLShiftC_32s | ippsAdd_16u_ISfs |
ippsMagnitude_32fc | ippsAddC_8u_Sfs |
ippsMax_16s | ippsAddC_8u_ISfs |
ippsMax_32f | ippsThreshold_GT_32f |
ippsMax_32s | ippsThreshold_LT_32f |
ippsMaxEvery_32f | ippsAutoCorr_16s_Sfs |
ippsMaxIndx_32f | ippsAutoCorr_32f |
ippsMean_32f | ippsAutoCorr_32fc |
ippsMin_32f | ippsAutoCorr_64f |
ippsMinIndx_32f | ippsAutoCorr_64fc |
ippsMinIndx_32s | ippsAutoCorr_NormA_32f |
ippsMinMax_32f | ippsAutoCorr_NormA_32fc |
ippsMove_16s | ippsAutoCorr_NormA_64f |
ippsMove_32f | ippsAutoCorr_NormA_64fc |
ippsMove_8u | ippsAutoCorr_NormB_32f |
ippsMul_32f | ippsAutoCorr_NormB_32fc |
ippsMul_32fc | ippsAutoCorr_NormB_64f |
ippsMul_64f | ippsAutoCorr_NormB_64fc |
ippsMulC_16s_Sfs | ippsConv_32f |
ippsMulC_32f | ippsConv_64f |
ippsMulC_64f | ippsCrossCorr_32f |
ippsPowerSpectr_32fc | ippsCrossCorr_32fc |
ippsRealToCplx_32f | ippsCrossCorr_64f |
ippsRShiftC_16s | ippsCrossCorr_64fc |
ippsRShiftC_32s | ippsDCTFwd_32f |
ippsSampleUp_32f | ippsDCTFwd_32f_I |
ippsSet_16s | ippsDCTFwd_64f |
ippsSet_32f | ippsDCTFwd_64f_I |
ippsSet_32fc | ippsDCTInv_32f |
ippsSet_32s | ippsDCTInv_32f_I |
ippsSet_64f | ippsDCTInv_64f |
ippsSet_8u | ippsDCTInv_64f_I |
ippsSortAscend_32s | ippsDFTFwd_CToC_32f |
ippsSqr_32f | ippsDFTFwd_CToC_32fc |
ippsSqrt_32f | ippsDFTFwd_CToC_64f |
ippsStdDev_32f | ippsDFTFwd_CToC_64fc |
ippsSub_32f | ippsDFTFwd_RToCCS_32f |
ippsSub_32fc | ippsDFTFwd_RToCCS_64f |
ippsSub_32s_Sfs | ippsDFTFwd_RToPack_32f |
ippsSubC_32f | ippsDFTFwd_RToPack_64f |
ippsDFTFwd_RToPerm_32f | ippsFFTInv_CToC_64f_I |
ippsDFTFwd_RToPerm_64f | ippsFFTInv_CToC_64fc |
ippsDFTInv_CCSToR_32f | ippsFFTInv_CToC_64fc_I |
ippsDFTInv_CCSToR_64f | ippsFFTInv_PackToR_32f |
ippsDFTInv_CToC_32f | ippsFFTInv_PackToR_32f_I |
ippsDFTInv_CToC_32fc | ippsFFTInv_PackToR_64f |
ippsDFTInv_CToC_64f | ippsFFTInv_PackToR_64f_I |
ippsDFTInv_CToC_64fc | ippsFFTInv_PermToR_32f |
ippsDFTInv_PackToR_32f | ippsFFTInv_PermToR_32f_I |
ippsDFTInv_PackToR_64f | ippsFFTInv_PermToR_64f |
ippsDFTInv_PermToR_32f | ippsFFTInv_PermToR_64f_I |
ippsDFTInv_PermToR_64f | ippsFIR_64f |
ippsFFTFwd_CToC_32f | ippsFIR_64fc |
ippsFFTFwd_CToC_32f_I | ippsIIR_32f |
ippsFFTFwd_CToC_32fc | ippsIIR_32fc |
ippsFFTFwd_CToC_32fc_I | ippsIIR_64f |
ippsFFTFwd_CToC_64f | ippsIIR_64fc |
ippsFFTFwd_CToC_64f_I | auto |
ippsFFTFwd_CToC_64fc | ippsMinEvery_32f |
ippsFFTFwd_CToC_64fc_I | ippsDiv_32f_I |
ippsFFTFwd_RToCCS_32f | ippsAdd_8u16u |
ippsFFTFwd_RToCCS_32f_I | ippsAdd_16s |
ippsFFTFwd_RToCCS_64f | ippsAdd_16s_I |
ippsFFTFwd_RToCCS_64f_I | ippsAdd_16s_ISfs |
ippsFFTFwd_RToPack_32f | ippsAdd_16sc_Sfs |
ippsFFTFwd_RToPack_32f_I | ippsAdd_16sc_ISfs |
ippsFFTFwd_RToPack_64f | ippsAdd_32s_ISfs |
ippsFFTFwd_RToPack_64f_I | ippsAdd_32sc_Sfs |
ippsFFTFwd_RToPerm_32f | ippsAdd_32sc_ISfs |
ippsFFTFwd_RToPerm_32f_I | ippsAddC_16s_Sfs |
ippsFFTFwd_RToPerm_64f | ippsAddC_16s_I |
ippsFFTFwd_RToPerm_64f_I | ippsAddC_16s_ISfs |
ippsFFTInv_CCSToR_32f | ippsAddC_16sc_Sfs |
ippsFFTInv_CCSToR_32f_I | ippsAddC_16sc_ISfs |
ippsFFTInv_CCSToR_64f | ippsAdd_32f_I |
ippsFFTInv_CCSToR_64f_I | ippsAdd_32fc |
ippsFFTInv_CToC_32f | ippsAdd_32fc_I |
ippsFFTInv_CToC_32f_I | ippsAdd_64f |
ippsFFTInv_CToC_32fc | ippsAdd_64f_I |
ippsFFTInv_CToC_32fc_I | ippsAdd_64fc |
ippsFFTInv_CToC_64f | ippsAdd_64fc_I |
ippsAddC_32f_I | ippsAddC_16u_Sfs |
ippsDiv_32f_I | ippsAddC_16u_ISfs |
ippsDivC_32f_I | ippsAddC_32s_Sfs |
ippsDivC_64f_I | ippsAddC_32s_ISfs |
ippsAddC_32sc_Sfs | ippsSubC_16u_ISfs |
ippsAddC_32sc_ISfs | ippsSubC_16s_Sfs |
ippsSub_8u_Sfs | ippsSubC_16s_I |
ippsSub_8u_ISfs | ippsSubC_16s_ISfs |
ippsSub_16u_Sfs | ippsSubC_16sc_Sfs |
ippsSub_16u_ISfs | ippsSubC_16sc_ISfs |
ippsSub_16s | ippsSubC_32s_Sfs |
ippsSub_16s_Sfs | ippsSubC_32s_ISfs |
ippsSub_16s_I | ippsSubC_32sc_Sfs |
ippsSub_16s_ISfs | ippsSubC_32sc_ISfs |
ippsSub_16sc_Sfs | ippsMulC_8u_Sfs |
ippsSub_16sc_ISfs | ippsDivC_8u_Sfs |
ippsSub_32s_ISfs | ippsFIR64fc_16sc_Sfs |
ippsSub_32sc_Sfs | ippsFIR64fc_32sc_Sfs |
ippsSub_32sc_ISfs | ippsFIR64fc_32fc |
ippsSubC_8u_Sfs | ippsFIR_32fc |
ippsSubC_8u_ISfs | ippsSubC_16u_Sfs |
参考文献 (英語)
Intel® Integrated Performance Primitives (Intel® IPP) Functions Optimized for Intel® Advanced Vector Extensions (Intel® AVX) (https://software.intel.com/en-us/articles/intel-integrated-performance-primitives-intel-ipp-functions-optimized-for-intel-advanced)
Haswell New Instruction Descriptions Now Available! (https://software.intel.com/en-us/blogs/2011/06/13/haswell-new-instruction-descriptions-now-available)
Intel® Advanced Vector Extensions Programming Reference
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。