- 締切済み
openCVでのNEON最適化
openCVのNEON対応に関して質問です。 (オープンソースの開発の仕方についての質問になるかもしれませんが。) 最近openCVのNEON対応に興味を持ち始め、 gitリポジトリをcloneしてソースの中身を追っています。 しかし、私の実力不足により具体的にどのような方法で NEONによる最適化を実現しているのか追いきれていません。 まず始めにcloneしてきたディレクトリ以下をARM_NEONやuint8x16_t等の キーワードで検索すると、極々一部の関数(normHamming)等にしか 明示的にNEON化されている箇所が見当たりません。 しかし一方で、http://code.opencv.org/projects/opencv/wikiから 「neon optimization」等のキーワードで検索をかけると、 下記のようにNEON対応された関数がいくつもあるように読み取れます。 http://code.opencv.org/projects/opencv/repository/revisions/42e0214de51394d9d2a2aa293cbda40145a720a9 そこでdiffを眺めるとGET_OPTIMIZED(hoge)というような マクロ経由で最適化対応をしているようです。 しかし、今度はGET_OPTIMIZEDでソースコードに検索をかけると、precomp.cppの中に 以下のような記述が見つかりました。 #ifdef HAVE_TEGRA_OPTIMIZATION #include "opencv2/core/core_tegra.hpp" #else #define GET_OPTIMIZED(func) (func) #endif 一見マクロ側は何もしていないように見えてしまいますが、 これから、どのようにNEON最適化が行われるのでしょうか? 現時点で全く想像が付かないため、何かしらの推測が出来る方が いましたらご教示頂ければ幸いです。 以上、よろしくお願い致します。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- kmee
- ベストアンサー率55% (1857/3366)
中身まで確認していませんが、常套手段として マクロは、コンパイル前に処理されて、展開したものをそのまま記述したのと同じ状態になります。 GET_OPTIMIZED(foo)(v0,v1) と呼び出したとき #define GET_OPTIMIZED(func) (optimized_##func) と定義してあれば、展開された結果 (optimized_foo)(v0,v1) となり、 optimized_foo(v0,v1) という記述したのと同じ意味になります。 #define GET_OPTIMIZED(func) (func) と定義してあれば、展開された結果 (foo)(v0,v1) となり、 foo(v0,v1) という記述したのと同じ意味になります。 仕様が同じで、実装の違う optimized_foo関数 と foo関数を用意すれば、利用する側では GET_OPTIMIZED(foo)(v0,v1) と書いておけば、#defineを変えるだけで、optimized_fooとfooを使い分けることができます。 これを手でやろうとしたら、いちいち検索して置換しなければなりません。この関数とは関係ない「foo」が無いか、逐次確認が必要です。 これも常套手段ですが、#defineでビルドするターゲットについての情報を定義して、#ifでターゲットに合せた記述をします。 これの場合 あらかじめ、TEGRAによる最適化ができるかどうかを調べて、利用できるなら HAVE_TEGRA_OPTIMIZATION というマクロを定義状態に、そうでなければ、未定義にしておきます。 そうすると #ifdef HAVE_TEGRA_OPTIMIZATION // TEGRAが使えるなら、下記のヘッダが#includeされます。 // おそらく、最適化を使った関数やマクロ等が宣言されています #include "opencv2/core/core_tegra.hpp" #else // 使えないなら、汎用版の関数をそのまま使うようにします #define GET_OPTIMIZED(func) (func) #endif
補足
ありがとうございます。 関数名切り替え用のマクロというイメージなのですね。 また、肝心の"core_tegra.cpp"はopenCVのソースツリーには含まれていませんでした。 以下を見るとTEGRA最適化周りはオープンソースでは無いとの回答があり、 https://groups.google.com/forum/?fromgroups=#!searchin/android-opencv/tegra/android-opencv/Gjz8T7cNN8E/SPHwFrEJJJQJ 以下のようにNVIDIAからTEGRAに最適化後のopenCVライブラリが提供されていたりするようなので、 https://developer.nvidia.com/tegra-android-development-pack 実質的にNEON最適化(画素値に対するループ処理部の書き直し)はopenCVのプロジェクト内ではほぼ進められておらず、非オープンソースの外部ライブラリを取り込んで対応しているという事でしょうか。