ONNX Runtimeでプロファイルを取ってみるの続きです。
前回、全処理の中でConvolution処理が大半を占めていることがわかりました。
今回から、この処理の高速化にとりかかります。
まず、てっとりばやく速くする方法として、OpenMPというものがあります。
これは、コードにディレクティブを挿入してコンパイル時に-fopenmp
というコンパイルオプションをつけるだけで処理が並列化されるものです。
#pragma omp parallel for
for (int i = 0; i < num; ++i) {
target_function(i);
}
例えばこのように、並列化したいfor文の上に#pragma omp parallel for
をつけると、そのfor文が並列化されます。
今回高速化するConvolution処理の使われ方をより詳細に見たところ、floatの2次元データを対象とした処理が主に使用されていたので、まずはそのケースで実行される演算処理を抜き出します。抜き出した処理のうちDepthwise畳み込み処理
の部分はfor文での繰り返し回数が多く、並列化が有効と考えられます。
実際に#pragma omp parallel for
をDepthwise畳み込み処理のfor文の前につけて並列化させたところ、これだけでも推論にかかる時間は**30%**高速化しました。
次回は更なる高速化のために、SIMD(single instruction, multiple data)を使って演算処理をより細かく並列化していきます。