1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

OpenMPによる並列化

Posted at

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)を使って演算処理をより細かく並列化していきます。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?