13

リアルタイムの速度を維持するために、複数の画像を並行して処理する必要があるアプリケーションがあります。

単一の CUDA デバイス上で OpenCV の GPU 関数をマルチスレッド方式で呼び出すことはできないと理解しています。次のような OpenMP コード構成を試しました。

#pragma omp parallel for
for(int i=0; i<numImages; i++){
    for(int j=0; j<numChannels; j++){
        for(int k=0; k<pyramidDepth; k++){
            cv::gpu::multiply(pyramid[i][j][k], weightmap[i][k], pyramid[i][j][k]);
        }
    }
}

これは正しくコンパイルおよび実行されるように見えますが、残念ながら同じ CUDA デバイス上で numImages スレッドを連続して実行しているようです。

複数の CUDA デバイスがある場合、複数のスレッドを並行して実行できるはずですよね? 複数の CUDA デバイスを入手するには、複数のビデオ カードが必要ですか?

nVidia GTX 690 デュアルチップ カードが、OpenCV 2.4 以降で 2 つの独立した CUDA デバイスとして機能するかどうかを知っている人はいますか? OpenCL で動作することは確認できましたが、OpenCV に関しては確認できませんでした。

4

4 に答える 4

5

画像全体を乗算してcv::gpu::multiply()関数に渡すだけです。

OpenCV と CUDA は、それを分割し、タスクを最適な方法で分割します。一般に、GPU の各コンピューター ユニット (コア) は複数のスレッドを実行できます (CUDA では通常 >=16)。これは、複数の GPU として表示できるカードを使用したり、複数のリンクされたカードを 1 台のマシンに配置したりすることに加えてです。

の全体的なポイントはcv::gpu、内部がどのように機能するかについて何も知らなくても済むようにすることです。

于 2012-06-22T14:45:46.910 に答える
4

マーティンからの答えは私にとってはうまくいきました。重要なのは、CUDA デバイスが計算能力 2 以上としてリストされている場合、gpu::Stream クラスを利用することです。コメント ミニ エディターでコード クリップを正しく投稿できなかったため、ここで再掲します。

cv::gpu::Stream stream[3];

for(int i=0; i<numImages; i++){
    for(int j=0; j<numChannels; j++){
        for(int k=0; k<pyramidDepth; k++){
            cv::gpu::multiply(pyramid[i][j][k], weightmap[i][k], pyramid[i][j][k], stream[i]);
        }
    }
}

上記のコードは、乗算を並行して実行しているようです (私のアプリでは numImages = 3)。GPU メモリへの画像のアップロード/ダウンロードを支援する Stream メソッドや、他のコードとの同期を支援するためにストリームの状態をチェックするメソッドもあります。

つまり... OpenCV GPU コードを並列に実行するために複数の CUDA デバイス (つまり GPU カード) を必要としないようです!

于 2012-06-26T00:18:23.953 に答える
0

OpenCV の GPU 関数については何も知りませんが、それらが完全に自己完結型 (つまり、GPU コンテキストを作成し、データを GPU に転送し、結果を計算し、結果を CPU に転送する) である場合、これらの関数がシリアル化されているように見えることは驚くべきことではありません。単一の GPU を使用する場合。

複数の GPU がある場合、OpenCV 関数に特定の GPU をターゲットにするように指示する方法が必要です。複数の GPU があり、それらを効果的にターゲットにできる場合、GPU 関数呼び出しが並列化されない理由はわかりません。OpenCV wiki によると、GPU 関数は単一の GPU のみを対象としていますが、自分で手動で作業を分割できます: http://opencv.willowgarage.com/wiki/OpenCV%20GPU%20FAQ#Can_I_use_two_or_more_GPUs.3F

GTX 690 のようなデュアル GPU は、GPU プログラムに関する限り、独自のメモリを備えた 2 つの異なるデバイスとして表示されます。ここを参照してください: http://forums.nvidia.com/index.php?showtopic=231726

また、コンピューティング アプリケーションにデュアル GPU ルートを使用する場合は、GTX 590 に比べてコンピューティング パフォーマンスがやや劣るため、GTX 690 をお勧めしません。

于 2012-06-21T19:20:10.753 に答える
0

GTX 290 は、使用する OpenCV のバージョンに関係なく、2 つの個別の CUDA デバイスとして動作します。GTX 290 のように 1 枚のカードに 2 つある複数の GPU を取得するために、複数の GPU カードは必要ありません。しかし、CUDA プログラミングの観点からは、290 で 2 つの GPU を使用することと個別に接続された GPU カード上の 2 つの GPU。多くの OpenCV ユーザーは、より多くの画像処理機能と簡単なマルチ GPU スケーリングを補完するために ArrayFire CUDA ライブラリを使用しています。もちろん、私の免責事項は、私が ArrayFire に取り組んでいるということですが、この場合に役立つと本当に思います。

于 2012-06-22T14:06:49.980 に答える