OpenVINO on IceLake (Vol.4)

なんだかスケートをしているようなタイトルの連載4回目、
Intelの第10世代CPU IceLakeでOpenVINOを試してみます

前回同様、使用するのはDell XPS 13 2in1、搭載されているのは下記のCPUとなります
Intel(R) Core(TM) i7-1065G7 CPU @ 1.30GHz
このCPUはGPUを内包しており、64EUのIntel Iris Plus グラフィックスが搭載されています
また実行ユニット数は、過去最大であったIntel Iris Pro Graphics 580(i7-6770HQ)の72EUにつぐ多さとなっています
メモリはDDR4-3733 16GBが搭載されています

このPCにUbuntu18.04をインストールし、OpenVINOの実行をしますが、前回に引き続き今回もCPUでの実行に注目してみましょう

比較するのはCometlake(インテル® Core™ i5-10210U プロセッサー)搭載の ノートPCとなります

前回はCometlakeとIcelake のCPUの機能の違いを比べてみましたが、実際にそれらがアプリケーションから呼ばれているかをOpenVINO toolkitにあるbenchmark_appを使用してチェックしてみましょう

ここで、security_barrier_camera_demoを使わずに最初からbenchmark_app使ったら?と言う声が聞こえてきそうですが、私が試す限りbenchmark_appではCPUの周波数が固定されてしまうようです
そのためデータの確認用に使用します

~/inference_engine_cpp_samples_build/intel64/Release/benchmark_app  -i ./images -m ~/openvino_models/ir/intel/vehicle-license-plate-detection-barrier-0106/FP16/vehicle-license-plate-detection-barrier-0106.xml -pc

このアプリケーションのオプションで-pcがありますが、こちらはPerformance countersオプションとなり、アプリケーションから呼び出しているライブラリが出力されます(下記は出力例となります)

 [ INFO ] Pefrormance counts for 0-th infer request:
 Placeholder                   NOT_RUN        layerType: Input              realTime: 0         cpu: 0               execType: unknown
 Placeholder_U8_FP32_Add_/F... EXECUTED       layerType: Reorder            realTime: 282       cpu: 282             execType: jit_uni_I8
 Add_/Fused_Add_               EXECUTED       layerType: ScaleShift         realTime: 243       cpu: 243             execType: jit_avx2_FP32
 MobilenetV2/Conv/BatchNorm... EXECUTED       layerType: Convolution        realTime: 615       cpu: 615             execType: jit_avx2_FP32
 MobilenetV2/Conv/Relu6        NOT_RUN        layerType: Clamp              realTime: 0         cpu: 0               execType: undef
 MobilenetV2/expanded_conv/... EXECUTED       layerType: Convolution        realTime: 560       cpu: 560             execType: jit_avx2_dw_FP32
 MobilenetV2/expanded_conv/... NOT_RUN        layerType: Clamp              realTime: 0         cpu: 0               execType: undef
 MobilenetV2/expanded_conv/... EXECUTED       layerType: Convolution        realTime: 592       cpu: 592             execType: jit_avx2_1x1_FP32
 MobilenetV2/expanded_conv/add NOT_RUN        layerType: Eltwise            realTime: 0         cpu: 0               execType: undef
 MobilenetV2/expanded_conv_... EXECUTED       layerType: Convolution        realTime: 2613      cpu: 2613            execType: jit_avx2_1x1_FP32
 MobilenetV2/expanded_conv_... NOT_RUN        layerType: Clamp              realTime: 0         cpu: 0               execType: undef
 MobilenetV2/expanded_conv_... EXECUTED       layerType: Convolution        realTime: 2192      cpu: 2192            execType: jit_avx2_dw_FP32
 MobilenetV2/expanded_conv_... NOT_RUN        layerType: Clamp              realTime: 0         cpu: 0               execType: undef
 MobilenetV2/expanded_conv_... EXECUTED       layerType: Convolution        realTime: 680       cpu: 680             execType: jit_avx2_1x1_FP32
 MobilenetV2/expanded_conv_... EXECUTED       layerType: Convolution        realTime: 889       cpu: 889             execType: jit_avx2_1x1_FP32 
...

CometlakeでモデルをFP16として実行した結果(左の数値は実際に呼び出された関数の数)は、
 148 jit_avx2_1x1_FP32
  76 jit_avx2_FP32
  64 jit_avx2_dw_FP32

Icelakeで実行した結果は、
   4 jit_avx2_1x1_FP32
 144 jit_avx512_1x1_FP32
  76 jit_avx512_FP32
  64 jit_avx512_dw_FP32

となっており、avx2が呼び出されていたほとんどの関数をavx512で置き換えています
これらを元にするとAVX512を使用したことが高速化につながった一つの要因だと考えられます

他の要因としては、キャッシュサイズが考えられます
Icelakeの各キャッシュは
L1d キャッシュ: 48K
L1i キャッシュ: 32K
L2 キャッシュ: 512K
L3 キャッシュ: 8192K
となり、CometlakeのL2キャッシュサイズ256K、L3キャッシュサイズの6MBを上回っていることを考えると、全体のスピードが上がる可能性が高いと考えられます

また、メモリに対するアクセス速度が変更されています
IcelakeはLPDDR4-3733 最大2チャンネルを使用し、チップの制限が無ければ29.8GB/s x 2の転送ができます
CometlakeはLPDDR4-2933 最大2チャンネルとなり、こちらもチップの制限が無ければ23.4GB/s x 2の転送ができます
双方を比較すると27%となります

次回はINT8の場合を考えてみましょう

続く…