hack のためのネタ帳, etc,,,

このページは 20160907: OpenCV-3.1.0 で OpenCL device の選択 のバックアップです。

環境変数による選択

以下の2つの環境変数で制御できる模様。
  • OPENCV_OPENCL_RUNTIME
  • OPENCV_OPENCL_DEVICE
具体的には以下のような感じ
echo Enable OpenCL for OpenCV
set OPENCV_OPENCL_RUNTIME=
echo Disable OpenCL for OpenCV
set OPENCV_OPENCL_RUNTIME=qqq
echo Select CPU 0
set OPENCV_OPENCL_DEVICE=:CPU:0
echo Select GPU 0
set OPENCV_OPENCL_DEVICE=:GPU:0
echo Select ALL 0
set OPENCV_OPENCL_DEVICE=:ALL:0
参考:

C++コードからの選択

いくつかの情報では、
cv::ocl::Context context;
context.create(cv::ocl::Device::TYPE_ALL);
cv::ocl::Device(context.device(i));
のような感じで行けるようなことを書いてあるのだが、試してみるとこれは全く効果が認められない。
まぁ、見るからに、cv::ocl::Device クラスのコンストラクタ呼んで、インスタンスをその場で破棄しているようにしか見えないのだが、 を眺めてみたところ、やっぱりそうとしか思えない。
とりあえず、cv::ocl::Device::getDefault() から cv::ocl::Contect::getDefault(int initialize = true) を呼んで、getCoreTlsData().get()->device により default device を決定しているようなので、
cv::ocl::Context::getDefault() = context;
としておけば、default context は置き換えられることは確認したのだが、cv::ocl::Context::p が protected であり、cv::ocl::Context::p->setDefault() を呼ぶ術がないため、不完全だ。
更に、device 番号は getCoreTlsData().get()->device から取っているのだが、これは、opencv-3.1.0/sources/modules/core/src/precomp.hpp で定義されている。そして、これはどうも OpenCV コンパイル時にのみ利用されるファイルであるらしく、開発環境用の include には install されないため、手が届かない。
どうすんだこれ???
動作中に動的に OpenCV のデバイスを切り替えたりってことはもとより、初期化時にデバイスを選択することすら出来そうにないぞ。

参考(にならなかったもの):

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

フリーエリア

管理人/副管理人のみ編集できます