2017-05-15 16 views
0

iMx6プラットフォームでバイエルからrgbへの変換を改善するためにOpenCLを使用しようとしています。私は変換のためにこのthe OpenCL Shaderを使用しています。私は、OpenCLのバージョンがOpenCVのcvtColor bayerからrgbへの変換(forループを使用)よりも速いことを期待しています。しかし、OpenCLのバージョンは、OpenCVのCPUベースの変換よりもはるかに遅いことが判明しました。OpenCL bayerからrgbへCPUのバージョンより遅い

OpenCVの:1280 * 960の画像 OpenCLののための28.3 FPS:1280 * 960の画像

size_t global[] = {1280, 960}; 
Mat bayer = Mat(960, 1280, CV_8UC1); 
Mat rgb_image = Mat(960, 1280, CV_8UC3); 
cl_input = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, width * height, bayer.data , &ret); 
if(ret != CL_SUCCESS){ 
    cout << "OpenCL Buffer Allocation Error\n" ; 
    exit(0); 
} 

cl_output = clCreateBuffer(context, CL_MEM_WRITE_ONLY | CL_MEM_USE_HOST_PTR, width * height * 3, rgb_image.data, &ret); 
if(ret != CL_SUCCESS){ 
    cout << "OpenCL OP Buffer Error\n" ; 
    exit(0); 
    } 

while(true){ 
    capture_image(bayer); 
    ret = clEnqueueNDRangeKernel(cq, kernel, 2, NULL, global, NULL, 0, NULL, NULL); 
    if(ret != CL_SUCCESS){ 
    cout << ret << " OpenCL kernel exec Error\n" ; 
    exit(0); 
    } 
    ret = clEnqueueReadBuffer(cq, cl_output, CL_TRUE, 0, width * height * 3, rgb_image.data, 0, NULL, NULL); 
    if(ret != CL_SUCCESS){ 
    cout << "OpenCL OP Buffer read Error\n" ; 
    exit(0); 
    } 
} 

のための7.15 fpsのは、私が賢明な構成で行方不明です何がありますか?私のOpenCLに新しいですし、私は次のようにどのようにloop.Theプラットフォーム情報内のOpenCLカーネルを呼び出すことを確認していない:

  • プラットフォーム名:ビバンテのOpenCLプラットフォーム
  • プラットフォームプロフィール:EMBEDDED_PROFILE
  • プラットフォームのバージョン:OpenCLの1.1
  • プラットフォームベンダー:ビバンテ社

  • デバイス名:ビバンテのOpenCLデバイス

  • デバイスプロファイル:EMBEDDED_PROFILE
  • デバイスバージョン:OpenCLの1.1
  • デバイスベンダー:ビバンテ社
  • デバイスの最大作業項目の寸法:3-D
  • デバイスの最大ワークグループサイズ:1024

PS :OpenCVでOpenCLサポートを使用することができません.i.mx6はOpenCLでOpenCLサポートに必要なフルプロファイルではないため、

答えて

0

少し奇妙に思えますイメージバッファではなくプレーンバッファですが、実行速度に大きな差が出るとは思われません。

0

スレッドごとに4ピクセル(2x2ベイヤーパターン)を処理します。これにより、fmodと3値条件(c?t:f)が回避されます。これを4でベクトル化して、スレッドごとに8x2ピクセルを生成することができます。したがって、red.xyzwなどでは4つの赤色ピクセル、.even.oddを使用して、書き込み時にデインターリーブを行い、インターリーブします。

また、ワークグループごとにスレッドが1つしかないこともわかります。 1つのデバイスタイプを対象としているので、ワークグループサイズを最大値に合わせてください。つまり、ベクトル化している場合は32x32または16x64です。

私はあなたの特定のデバイスのことは知らないが、これはディスクリートGPUにあった場合は大きな違いを生むだろう2つの最適化がある
0

    グローバルメモリから
  1. ないでください再読み込みデータ(リンク先のコードでは、各ソースピクセルは何度も読み込まれます)。ワークグループ内のワークアイテム間でグローバルメモリから読み取った値を共有するには、共有ローカルメモリを使用します。あなたがこれをしていない場合は、グローバルメモリの代わりにイメージを使用してください。これはテクスチャキャッシュを利用して、同じメリットを得ることができます。

  2. 合体読み取りと書き込みを使用していることを確認してください。一般的に、これは、隣接する作業項目が隣接するメモリ位置を読み取っていることを確認することを意味します。

関連する問題