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/repositor …

そこで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最適化が行われるのでしょうか?
現時点で全く想像が付かないため、何かしらの推測が出来る方が
いましたらご教示頂ければ幸いです。

以上、よろしくお願い致します。

A 回答 (1件)

中身まで確認していませんが、常套手段として



マクロは、コンパイル前に処理されて、展開したものをそのまま記述したのと同じ状態になります。

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=#!se …

以下のようにNVIDIAからTEGRAに最適化後のopenCVライブラリが提供されていたりするようなので、
https://developer.nvidia.com/tegra-android-devel …

実質的にNEON最適化(画素値に対するループ処理部の書き直し)はopenCVのプロジェクト内ではほぼ進められておらず、非オープンソースの外部ライブラリを取り込んで対応しているという事でしょうか。

補足日時:2012/12/22 16:32
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

今、見られている記事はコレ!

  • 基本情報技術者試験の言語ってどうやって選ぶ?

    SEを目指す場合、基本情報技術者試験を経て実務に就いた人も多いのではないでしょうか。教えて!gooにはSEを目指している質問者からこんな質問が寄せられました。 「基本情報技術者試験のC言語とJavaの違い?」 将...

  • 【100均グッズで!】カラフルクレヨンキャンドルを作ってみた

    市販されているキャンドルには、自分好みの色合いや、好きな形状のものなど、なかなかピッタリのものが見つからないという人も多いことだろう。自分で手作りしてみるのもありかもしれないと、そのやり方を「教えて!...

  • 不倫相手に5年ぶりに連絡したらフラれた

    常に世間の大きな関心ごととなる著名人の不貞問題。一般家庭の不倫に対してもそれは同じようで、「教えて!goo」によせられた「人は5年も経つと心は変わってしまうのでしょうか?」という質問には多くの回答が書き込...

  • 【長谷川豊】『名無しです』さんから来たメッセージ

    先日、私が別でやっている連載に対して、極めて分かりやすく、的を射たコメントが来たので是非「教えて!goo」の連載でもシェアしたいと思います。 私は沖縄で起きた痛ましい女性の暴行死事件の記事に関連して、あ...

  • おしゃれは世代を越えて。多様化する死装束の中にはドレスも!?

    日本では亡くなった人間が、現世に禍根を残していると「うらめしや~」というように幽霊になって出てくると言われている。幽霊について伝統的なイメージといえば、頭に巻いた三角の布に、真っ白な死装束、そして足が...

おしトピ編集部からのゆる~い質問を出題中

お題をもっとみる

このQ&Aを見た人が検索しているワード


このカテゴリの人気Q&Aランキング

おすすめ情報

カテゴリ