• 締切済み

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

みんなの回答

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.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

shibacoco09
質問者

補足

ありがとうございます。 関数名切り替え用のマクロというイメージなのですね。 また、肝心の"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のプロジェクト内ではほぼ進められておらず、非オープンソースの外部ライブラリを取り込んで対応しているという事でしょうか。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • MacへのOpenCVについて

    MacへのOpenCVについて 失礼します。 MacOSX10.6にOpenCVをインストールしている最中なのですが、問題が発生して先に進まなくなってしまい、困っています。 ちなみにこちらのサイト→http://keepkeptkept.seesaa.net/article/153200416.htmlを参考のさせていただいているのですが、3のところでつまづいてしまいました。 3.CMakeでのインストール (ver2.1 64bit or 32bit) まず、ソースファイルを入手するためにSubversionのインストール。 $ sudo port subversion 次に、cmakeのインストール。ちなみにcmakeはクロスプラットフォームのmakeのこと。 $ sudo port cmake そして、ソースファイルの入手。 $ svn co https://code.ros.org/svn/opencv/trunk/opencv ここまではうまく行くのですが、次の $ cv opencv cmakeを使ってビルドします。 を実行すると-bash: cv: command not foundと返されてしまいます。これはPATHが通っていないということなのかなと考えているのですが、解決方法がわかりません。 勉強不足でもうしわけないのですが、ご教授よろしくお願い致します。 * グレード

  • OpenCVをC++2010で使おうとしてます。

    OpenCVをC++2010で使おうとしてます。しかし以下のようなエラーで上手く成功しません 1>------ ビルド開始: プロジェクト: image, 構成: Debug Win32 ------ 1> image.cpp 1>c:\users\moeru\documents\visual studio 2010\projects\image\image\image.cpp(8): fatal error C1083: include ファイルを開けません。'highgui.h': No such file or directory ========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ========== パソコンはソニーのバイオで、windows7です。 参考文献はOpenCVプログラミングブック第2版。 インクルードファイルのディレクトリの設定は。 C:\Program Files\OpenCV\cv\include C:\Program Files\OpenCV\cvaux\include C:\Program Files\OpenCV\cxcore\include C:\Program Files\OpenCV\otherlibs\highgui ライブラリの方の設定は C:\Program Files\OpenCV\lib プロジェクト作成は win32→[win32プロジェクト]を選択しファイル名をimageにしました。 アプリケーション設定では追加のオプションの[空のプロジェクト(E)]にチェックマークをして完了しました。 次にプロジェクトの静的ライブラリの設定で、[構成プロパティ]→[リンカ]→[入力]と進み 追加の依存ファイルに ;highgui.lib;cxts.lib;cv.lib;cxcore.lib;ml.lib;cvaux.lib;cvhaartraining.lib と入力しました。 ソースコード生成で、ソリューションエクスプローラー→ソースファイルを右クリック→追加→新しい項目→visualC++→コード→C++ファイル(.cpp)を選択し、ファイル名をimageにしました。 そのまま本のあるサンプルプログラムをダウンロードし貼り付けをしてデバックしました。 以上の手順で何か間違っているところはありますか? 本にある内容をそのまま実行しましたが上手くいきません。PCやプログラミングも大変初心者でわからないこと沢山ありますが、どなたかご教授をおねがいします。

  • OpenCVを使ったiPhoneアプリ開発!

    OpenCV を使ったiPhoneアプリを Xcode 3.1.4 で作りたいのですが,どうやって環境を整えればいいか分かりません??助けて下さい!! PC全くの素人です!授業でC++をVisual Studioで一通り扱ったくらいです. 現在, Mac OS X 10.5.8 を利用していて, Xcode 3.1.4 と iPhone SDK 3.1.3 をインストールしました. 今回,OpenCV を使ったiPhoneアプリを Xcode 3.1.4 で作りたいのですが, どこからOpenCVのライブラリやリソース等を入手し,どのディレクトリにいれ,どんなセッティングをすればいいのか全く分かりません. このサイトを見ますと, 「XcodeでOpenCV開発」 http://d.hatena.ne.jp/MineAP/20080112/1200125226 「ヘッダ検索パス」や「アーキテクチャ」の設定が何をしている作業のことか分からないのと,そもそもどのOpenCVライブラリをダウンロードしたらいいのか,また,Macを使っているのにIntel向けのアプリにしてしまっていいのか(最終的にはiPhoneで使えるアプリを作りたいですが,Macでも動いてほしい)がさっぱりです. また,こちらのサイトの方には 「iPhoneでOpenCVを使う方法」 http://niw.at/articles/2009/03/14/using-opencv-on-iphone/ja iPhoneでOpenCVを使う方法が書いてあるのですが,扱っているソースコードとリソースのバージョンがOpenCV 2.2.0、iOS SDK 4.3、Xcode4 で私の環境と異なっているのと,gitおよび,githubが何なのかWikipediaで調べても全く分からず,貼ってあるリンクのファイルがなんの為のものかも分からず,お手上げ状態です. プログラムについては文法はC++に関して一通りやりましたが,構造や仕組みなどに関しては全く駄目なので,なるべく詳しい解説をして下さると大変助かります!!!

    • 締切済み
    • Mac
  • chromium OSのソースコードについて

    chromium OSのソースコードについて http://dev.chromium.org/developers/how-tos/get-the-code でとってきたソースをISO化しても動きません いろいろ(仮想化でLINUXベースで動かしたり)試してみても動きません ソースがこれだけでは足らずどこかに組み込む等をしなければならないのでしょうか?

  • Cプログラムの解析(関数の呼び出し関係など)

    仕事で必要なため、C言語の勉強をしています。 既存のプログラムに変更を加えるのために、膨大な量のソースコードを ながめて関係を把握しようとしているのですが、効率のよいやり方が わかりません。 バグのない盛り込みをするために、関数の呼び出し関係などを検索して 調べEXCELに書き出したりなどしているのですが、限界を感じています。 ツールをいくつか試用してみたのですが、どうもしっくりくるものが ありません。 例えば、 func_a() -> func_b() -> func_c() -> func_d() という関係 になっているものがあったとして、func_a() -> func_b()や func_b() -> func_c()の関係は表示できても、 func_a() -> func_b() -> func_c() の関係は一度に表示できず、 自分の頭の中で組み合わせて覚えておかなければならないなど.. みなさんは、ソースコードを解析し、その結果を把握して変更を加える際、 どうされているのでしょうか? アドバイスよろしくお願いします。

  • vinelinuxでapt-getが使えない。

    現在、vineで自宅サーバをしているのですが、再インストールしたら、apt-getが接続できなくなってしまいました。 インターネットには接続しています。 ネットで検索して、接続先を変更しましたがダメでした。。 エラー内容は ----------------------------------------- エラー http://updates.vinelinux.org 3.2/i386 release Temporary failure resolving 'updates.vinelinux.org' 以下の取得に失敗しました: http://updates.vinelinux.org/apt/3.2/i386/base/release Temporary failure resolving 'updates.vinelinux.org' パッケージリストを読みこんでいます... 完了 依存情報ツリーを作成しています... 完了 W: いくつかのリポジトリのリリースファイルが取得できませんでした。取得できなかっ たリポジトリは無視されます。 W: この問題を解決するためには 'apt-get update' を実行する必要があるかもしれませ ん。 E: いくつかのインデックスファイルのダウンロードに失敗、無視、あるいは古いものが 使用されました。 ------------------------------------- です。 分かる方いましたら、お願いします。 vienLinuxでapt-getが使えないと不便で仕方ありません。

  • eclipseを使ってRedmineのSubversionを利用する方法

    eclipseを使ってRedmineのSubversionを利用する方法 Redmineを使ってバージョン管理をしているオープンソース ソフトウェアがあります。このソフトウェアのソースコードを 入手し、ソフトウェアをコンパイルして利用したいのですが、 ソースコードの入手方法がわかりません。 Redmineのリポジトリ欄をみるとSubversionとあります。その示す とおり、Subversionの形式なのかなと思いeclipseでSubversionの プラグインを入れて読み込めるようにしたのですがRedmineの サイトのどのurlをeclipseに入力していいのかがわかりません 具体的なソフトウェアはjdownloaderです。サイトは以下です。 ​http://svn.jdownloader.org/​ 私はどのurlをeclipseに入力すればいいのでしょうか。 何か根本的に間違っていたら併せてご指摘いただけると嬉しいです。 よろしくお願いいたします

  • RaspberryPi3 Jessieの日本語化

    http://xn--u9j0md1592aqmt715c.net/raspbian-jessie-startup-conf/ 上記サイトに従い、 sudo apt-get install ttf-kochi-gothic xfonts-intl-japanese xfonts-intl-japanese-big xfonts-kaname uim uim-anthy jfbterm とするもFailed Fetchと出て実行できず。 調べた結果、apt-getの参照リポジトリの変更が必要とのことで、 http://akkagi.info/20150522_web/ 上記サイトの $ sudo vi /etc/apt/sources.list deb http://mirrordirector.raspbian.org/raspbian/ jessie main contrib non-free rpi としてapt-getのリポジトリを変更。 再度、 sudo apt-get install ttf-kochi-gothic xfonts-intl-japanese xfonts-intl-japanese-big xfonts-kaname uim uim-anthy jfbterm とするもUnable to locate packageとなってしまいました。 Jessieのクリーンインストールからはじめるので、 日本語化の手順を御教示下さい。 全ての日本語の部分が四角に文字コードと思われる数字4つの表示ではRaspberry Piで検索を掛けて調べることもままならず困っております。

  • 商用利用について(GPL ライセンス)

    Apophysis 7X https://sourceforge.net/projects/apophysis7x/ https://en.wikipedia.org/wiki/Apophysis_(software) こちらのフリーソフトで生成した画像を商用利用する事は可能でしょうか?(商用のデザインの一部に使用するなど) オープンソースでライセンスは GNU General Public License と記載あるのですが プログラムその物のラセンス?のようなので 作った画像自体はどうなるのか分からなかったので質問させて頂きました。 画像だけを使いたく、コードなどには詳しくないため教えて頂けると嬉しいです。

  • Eclipse、clone利用時に型の安全性の警告を消したい

    行いたい事 エクリプスで、clone&キャスト時に、表示される警告文を消すコーディング方法 ソース Class Hoge { private HashMap<String,Hogex> hoge = new HashMap<String,Hogex>(); public HashMap<String,Hogex> getCloneHoge(){ return (HashMap<String,Hogex>)hoge.clone(); } } getCloneHoge()の return (Map<String,Hogex>)hoge.clone(); のコードに、 型の安全性: Object から HashMap<String,Hogex> へのキャストは、実際には消去された型 HashMap に対してチェックを行います。 という警告文が表示されます。 @SuppressWarnings("unchecked") をつければ、警告は消えますが、コード自体を修正して対応する方法は、無いのでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • Java