2017-01-17 31 views
1

GPUとCPU使用のパフォーマンスの違いを調べるために、以下のコードを実行しました。私はcv::cvtColor()の平均時間を計算しています。OpenCV(Mat/Umatオブジェクト)でのOpenCLの使用方法の理解

  1. Just_mat()
  2. Just_UMat()MatオブジェクトのためにOpenCLを使用しない)(MatオブジェクトのためにOpenCLを使用して)
  3. OpenCL_Mat()
  4. OpenCL_UMat()UmatオブジェクトのためにOpenCLを使用しない)(使用した:私は、4つのファンクションコールを実行しますOpenCL for UMatオブジェクト)

CPUとGPUの両方。
私は、GPUとCPU使用率の間に大きなパフォーマンス差は見当たりませんでした。 OpenCLのマット付|

int main(int argc, char* argv[]) 
{ 
    loc = argv[1]; 
    just_mat(loc);// Calling function Without OpenCL 
    just_umat(loc);//Calling function Without OpenCL 
    cv::ocl::Context context; 
    std::vector<cv::ocl::PlatformInfo> platforms; 
    cv::ocl::getPlatfomsInfo(platforms); 
    for (size_t i = 0; i < platforms.size(); i++) 
    { 
     //Access to Platform 
     const cv::ocl::PlatformInfo* platform = &platforms[i]; 

     //Platform Name 
     std::cout << "Platform Name: " << platform->name().c_str() << "\n" << endl; 

     //Access Device within Platform 
     cv::ocl::Device current_device; 
     for (int j = 0; j < platform->deviceNumber(); j++) 
     { 
      //Access Device 
      platform->getDevice(current_device, j); 
      int deviceType = current_device.type(); 
      cout << "Device name: " << current_device.name() << endl; 
      if (deviceType == 2) 
       cout << context.ndevices() << " CPU devices are detected." << std::endl; 
      if (deviceType == 4) 
       cout << context.ndevices() << " GPU devices are detected." << std::endl; 
      cout << "===============================================" << endl << endl; 
      switch (deviceType) 
      { 
      case (1 << 1): 
       cout << "CPU device\n"; 
       if (context.create(deviceType)) 
        opencl_mat(loc);//With OpenCL Mat 
       break; 
      case (1 << 2): 
       cout << "GPU device\n";    
       if (context.create(deviceType)) 
        opencl_mat(loc);//With OpenCL UMat 
       break; 
      } 
      cin.ignore(1); 
     } 
    } 
    return 0; 
} 
int just_mat(string loc);// I check for the average time taken for cvtColor() without using OpenCl 
int just_umat(string loc);// I check for the average time taken for cvtColor() without using OpenCl 
int opencl_mat(string loc);//ocl::setUseOpenCL(true); and check for time difference for cvtColor function 
int opencl_umat(string loc);//ocl::setUseOpenCL(true); and check for time difference for cvtColor function 

上記コードの(ミリ秒単位で)出力
__________________________________________
ある| GPU名| OpenCl UMatを使って|
| _________________________________________ |
| --Carrizo --- | ------ 7.69052 ------ | ------ 0.247069 ------- |
| _________________________________________ |
| ---島--- | ------- 7.12455 ------ | ------ 0.233345 ------- |
| _________________________________________ |


________________________________________
| ---- CPU --- | OpenCL Matの場合| OpenCl UMatを使って|
| _________________________________________ |
| --- AMD --- | ------ 6.76169 ------ | -------- 0.231103 -------- |
| _________________________________________ |


________________________________________
---- CPU --- | WithOut OpenCL Mat | WithOut OpenCl UMat |
| ______________________________________________ |
| ---- AMD --- | ------ 7.15959 ------ | ------------ 0.246138 ----------- - |
| ______________________________________________ |
コードで

、マットオブジェクトを使用すると、常にUMATオブジェクトを使用してCPU &上で実行され、常にGPU上で実行され、関係なく、コードocl::setUseOpenCL(true/false);
の誰もが、すべての出力時間変化の理由を説明できますか?

もう1つ質問がありますが、OpenCL固有の.dllを.exeファイルで使用していませんでしたが、OpenCVをCmakeでビルドしている間にGPUがエラーなしで使用されましたWith_OpenCL OpenCLで必要なすべての機能をopencv_World310.dllに組み込みましたか?マットオブジェクトを使用してコードで

+0

このスレッドはあなたの興味を引くでしょう。 http://answers.opencv.org/question/58331/opencv-300-and-opencl-benchmark-sobel-edge-detection/ –

答えて

2

は、必ずしも常にUMATオブジェクトを使用してCPU &上で動作するコードOCLにかかわらず、GPU上で実行さ:: setUseOpenCLを(真/偽)。

これは質問か声明かどうかわかりません。どちらの場合でも部分的に真です。 3.0では、UMatの場合、専用のGPUがないと、OpenCVはCPU上のすべてを実行します。あなたが具体的にMatを求めるなら、CPU上でそれを得る。

少数のデザインの選択は、新しいアーキテクチャをサポートしています。そして、あなたの場合には、あなたが特別それぞれを選択することで/ CPUあなたのGPUのそれぞれで実行するように、両方の指示している(以下のCPUを選択する「の詳細)... thisをお読みください。

  1. 統一抽象CV :: UMAT のOpenCLを呼び出すために必要とせず、CPUやOpenCLのコードを使用して実施される同じAPIを可能に明示的バージョンを加速させた。存在する場合、これらの関数は、OpenCLの -enabled GPUを使用しますシステムでは、自動的にCPU に切り替わります。

  2. UMat抽象化によって、関数を非同期的に呼び出すことができます。 OpenCVバージョン2.xのcv :: Matとは異なり、cv :: UMatのデータは、そのデータメンバーではなく、クラスのメソッドを使ってアクセスされます()。このようなアプローチにより、 の実装では、CPUコードが結果を絶対的に必要とする場合にのみ、GPUの完了を明示的に待機することができます。

  3. UMatの実装では、OpenCVに渡されるポインタからの割り当てを含め、Intel SoC上で使用可能なCPU-GPU共有物理メモリを使用します。

私はまた、 "OpenCLのを使用して、" 誤解があるかもしれないと思います。 UMatを使用する場合、特にGPUを使用しようとしています。そして、私はCVを使ってCLライブラリのいくつかを自動的に使用すると信じています。2.Xの側面として、特に/手動でcv :: oclを実行しました。これは3.Xの2.Xレガシーコードを使用している場合は注意してください。それを行う理由はありますが、それは必ずしも単純ではありません。しかし、戻ってあなたが言うのトピック、

上のOpenCL UMATと

あなたが潜在的に冗長化されています。あなたのスニペットにあるCLコードは基本的にどのような機器がインストールされているか、その数、名前、使用方法の選択です...私はそれがインスタンス化される方法を掘り下げなければならないでしょうが、それをUMatにすると自動的にOpenCLがTrueに設定されますか? (link)それはあなたが提示したデータを確実にサポートするでしょう。おそらくocl :: setUseOpenCLの状態をfalseに設定した後にそれをチェックし、UMatを使ってそのアイデアをテストできます。

最後に、私はあなたのCPUがGPUを内蔵していると推測しています。したがって、OpenCLとの並列処理を実行しており、別個/専用のGPUに移動して戻って時間を浪費することはないため、GPUよりもパフォーマンスが向上します(技術的にはCPUを実行していないため)...あなたが具体的に使用しているのは、Matが使用されているCPUだけです。

あなたの最後の質問ですが、私は確信していません。これは私の推測です:OpenCLアーキテクチャはGPUにあります.CLを使ってCVをインストールすると、2つのライブラリと関連するヘッダーファイルの間にリンクをインストールします。私はあなたがその魔法を起こすために必要なdllファイルを知りません。

関連する問題