閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

OpenCVのSIMD

qiita.com

今度はOpenCVについて復習というか予習しようとネットサーフィンしていました。前一瞬触ったときはバージョン2だったと思いますが、もう4になっているんですね。で、上記のQiita記事もなるほど~と読んでいました。

ただ、ループ版が遅いのはatメンバ関数が遅いのもあるのでは?とポインタ(cv::Mat::data)を直に触ってみたりしましたが、それでもcv::max等の方が圧倒的に速い。なんでやとソースを見てみると、SIMDを使って最適化されているようです(するかどうかはコンパイル時のオプションによるので環境次第)。

SIMDは仕事でも使う機会がなかったので単語しか知らなかったのですが、複数の変数を一括で処理するための仕組みらしい。コンピュータ将棋とかではよく見るのですがAVXとかSSEとか、呪文みたいだなとスルーしていました。今年も使う機会あまりなさそうですが、暇だったのでちょっとソース読んでみました。

8bitグレースケールの画像だと画像はucharの配列で表せますが、これを1要素ずつ処理するのではなく、16要素(int128の変数に入れて)ずつにまとめて処理することでループ回数をそれだけ減らせて嬉しい、ということのようです。

これを自分で使いたい、と思うと環境毎に使える関数が違ったりと面倒ですが、OpenCVではこれ自体をラップしたAPIも提供しているようで、これを使えば自分でもある程度パフォーマンスを気にしたコードが書けるようです。よくできてますね。

qiita.com

画像処理を速くしたいとなるとCUDAとかに行っちゃいそうですが、思ったより手軽ですしこれも選択肢のひとつとして頭に入れておくと良さそうですね。