1

GPUを使用してSURFアルゴリズムを高速化したい。しかし実際には、CPU(enale TBB)はSURFアルゴのGPUよりも高速であることがわかりました。 私のハードウェアとOS情報: CPU:Intel(R)Xeon(R)CPU E3-1230 V2 @ 3.30GHz(4コア+ 8スレッド)GPU:Nvidia GTX 660ti〜1000MHz(1344 GPUコア)ubuntu 12.04(64ビット)

シーンを適用する: 私のフォルダには約120枚の画像があります。SURFを使用してすべての画像のキーポイントを取得する必要があります。

時間ログ

すべてのイメージのCPU(TBB)、時間ログの使用:

DB:/ home / ole / MatchServer / ImgDB0 / img0のインデックス作成SURFALGO(ON TBB)のコスト時間:0.00666648

インデックス作成DB:/ home / ole / MatchServer / ImgDB0 / img1 onSURF ALGO(ON TBB)[s]:0.00803925

DB:/ home / ole / MatchServer / ImgDB0 / img2のインデックス作成SURFALGO(ON TBB)のコスト時間:0.0066344

データベースのインデックス作成:/ home / ole / MatchServer / ImgDB0 / img3 SURF ALGO(ON TBB)のコスト時間:0.00625698

DB:/ home / ole / MatchServer / ImgDB0 / img4のインデックス作成SURFALGO(ON TBB)のコスト時間:0.00699448

DBのインデックス作成:/ home / ole / MatchServer / ImgDB0 / img5 SURF ALGO(ON TBB)のコスト時間[s]:0.00621663

        .................more..................................

すべての画像のGPU、時間ログ(すべての画像のGPUには2行のログがあり、1つはGPU Memにimgをアップロードし、2つ目はSURF_GPUアルゴリズムが時間を費やします):

DBのインデックス作成:/ home / ole / MatchServer / ImgDB0 / img0 GPUアップロードイメージのコスト時間:1.99329

DB:/ home / ole / MatchServer / ImgDB0 /img0のインデックス作成GPUのコスト時間SURFALGO[s]:0.00971809

DBのインデックス作成:/ home / ole / MatchServer / ImgDB0 / img1 GPUアップロードイメージのコスト時間:0.000157638

DB:/ home / ole / MatchServer / ImgDB0 /img1のインデックス作成GPUのコスト時間SURFALGO[s]:0.00618778

DBのインデックス作成:/ home / ole / MatchServer / ImgDB0 / img2 GPUアップロードイメージのコスト時間:8.8108e-05

DB:/ home / ole / MatchServer / ImgDB0 /img2のインデックス作成GPUのコスト時間SURFALGO[s]:0.00736609

DBのインデックス作成:/ home / ole / MatchServer / ImgDB0 / img3 GPUアップロードイメージのコスト時間:8.8599e-05

DB:/ home / ole / MatchServer / ImgDB0 /img3のインデックス作成GPUでのコスト時間SURFALGO[s]:0.00559131

DBのインデックス作成:/ home / ole / MatchServer / ImgDB0 / img4 GPUアップロードイメージのコスト時間:8.7626e-05

DB:/ home / ole / MatchServer / ImgDB0 /img4のインデックス作成GPUのコスト時間SURFALGO[s]:0.00610033

DBのインデックス作成:/ home / ole / MatchServer / ImgDB0 / img5 GPUアップロードイメージのコスト時間:8.9125e-05

DB:/ home / ole / MatchServer / ImgDB0 /img5のインデックス作成GPUのコスト時間SURFALGO[s]:0.00632997

      ............................more..................................

最初の画像は、画像マットをGPUにアップロードするのに約2秒かかることがわかりました。次は通常約0.000157638秒です。

GPUコード

    try
    {
        double t0 = (double)getTickCount();
        cv::gpu::SURF_GPU surf_gpu;
        Size size = help_img.size();
        Size size0 = size;
        int type = help_img.type();
        cv::gpu::GpuMat d_m(size0, type);
        if(size0 != help_img.size() )
            d_m = d_m(Rect((size0.width - size.width) / 2, (size0.height - size.height) / 2, size.width, size.height));
        d_m.upload(help_img);
        double t = ((double)getTickCount() - t0)/getTickFrequency();
        std::cout << "indexing DB:"<< path << " cost time on upload image[s]: " << t << std::endl;

        t0 = (double)getTickCount();
        surf_gpu(d_m, cv::gpu::GpuMat(), help_keypoints);
        t = ((double)getTickCount() - t0)/getTickFrequency();
        std::cout << "indexing DB:"<< path << " cost time on Gpu image[s]: " << t << std::endl;
    }
    catch (const cv::Exception& e)
    {
       printf("issue happen!");
    }

次の質問についていくつかの提案をするのを手伝ってください:

1.最初の画像のGPUへのアップロードが約2秒非常に遅いのはなぜですか?

2. GPUがSURFアルゴリズムを加速しない理由、SURFには多くの計算があり、理論的には、GPUはそれを加速できます。

3. SURFアルゴリズムのGPUパフォーマンスを改善するにはどうすればよいですか?

ありがとう!!

4

1 に答える 1

3
  1. GPU への最初のアップロードは常に遅くなります。実際の作業を行う前に、GPU を初期化する必要があります。これは、デフォルトの CUDA コンテキストが最初の CUDA 呼び出しで作成されるためです。この場合、これは GPU Mat へのアップロードです。回避策は、実際の作業を行う前にランダムな GPU 関数を呼び出すことです。

  2. 比較している GPU と CPU によって異なります。使用している XEON のようなハイエンド CPU は、TBB を使用すると勝つ可能性が高くなります。実際の高速化については、NVIDIA Tesla などのハイエンド GPU を使用してみてください。OpenCV の現在の実装は、使用している Kepler アーキテクチャ GPU に最適化されていない可能性があります。

  3. それに対する決まった答えはありません。これは、アルゴリズムの並列性、最適な実装、およびシステムに存在するハードウェアに依存します。

于 2012-09-24T12:05:11.300 に答える