インテル® IPP におけるインテル® AVX2 向け最適化

同カテゴリーの次の記事

Android* でインテル® インテグレーテッド・パフォーマンス・プリミティブ (インテル® IPP) を使用する

この記事は、インテル® デベロッパー・ゾーンに掲載されている「Intel IPP support for Intel® AVX2」の日本語参考訳です。


第 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)

Haswell New Instruction Descriptions Now Available!

Intel® Advanced Vector Extensions Programming Reference

コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

関連記事

  • インテル® AVX をサポートする第 2 および第 3 世代インテル® Core™ プロセッサー・ファミリー向けに手動でコードを配置するにはインテル® AVX をサポートする第 2 および第 3 世代インテル® Core™ プロセッサー・ファミリー向けに手動でコードを配置するには 手動プロセッサー・ディスパッチ機能を使用すると、指定したインテル・プロセッサーで実行する複数バージョンの関数を記述することができます。インテル・プロセッサーのタイプはランタイムで判定され、該当する関数が実行されます。この機能は、IA-32 と インテル 64 をサポートするインテル・プロセッサーでのみ利用できます。互換プロセッサーや […]
  • とらえどころのないアルゴリズム – 並列スキャン (追記)とらえどころのないアルゴリズム – 並列スキャン (追記) この記事は、インテル® デベロッパー・ゾーンに公開されている「Elusive Algorithms - Parallel Scan」の日本語参考訳です。 先月、IDZ の MIC フォーラムでの問い合わせ "C 言語でインテル® Cilk™ Plus を使用して包括的なスキャンを行うには?" […]
  • インテル® AVX-512 で x265 を高速化インテル® AVX-512 で x265 を高速化 この記事は、インテル® デベロッパー・ゾーンに公開されている「Accelerating x265 with Intel® Advanced Vector Extensions 512 (Intel® AVX-512)」の日本語参考訳です。 この記事の PDF 版はこちらからご利用になれます。 はじめに 目的 CPU […]
  • SIMD アーキテクチャーの略語の解説SIMD アーキテクチャーの略語の解説 この記事は、Go Parallel に掲載されている「Decoding Acronyms of SIMD Architectures」 (http://goparallel.sourceforge.net/decoding-acronyms-simd-architectures/) […]
  • コードの現代化を成功に導く 3 つのアドバイスコードの現代化を成功に導く 3 つのアドバイス この記事は、インテル® デベロッパー・ゾーンに公開されている「Three Pieces of Advice for Code Modernization Success」の日本語参考訳です。 プログラムを高速化するための開発者への 3 つのアドバイスについてブログの執筆依頼を受けたとき、最初に思い浮かんだのは […]