0

オーディオのエンコード/デコードを行うライブラリに取り組んでいます。エンコーダーは、利用可能な場合、複数のコア (boost ライブラリを使用する複数のスレッド) を使用できる必要があります。私が今持っているのは、すべてのエンコーディング関連の操作を実行するクラスです。

私が取りたい次のステップは、そのクラスをスレッド化することです。だから私はこれを行う方法を考えています。

スレッドクラスを作成し、n 個のコアに対して n 個のスレッドを作成し、適切な引数を使用してエンコーダーを呼び出すことを考えました。しかし、これはやり過ぎで、別のクラスは必要ないので、スレッド作成に「ユーザー インターフェイス」を利用します。

何か提案があることを願っています。

編集: CUDAを使用して入力データの統計を作成し、前処理に複数のスレッドを使用することを余儀なくされています。そのため、システムに複数のカードがある場合、それらを並行して使用する唯一の方法は、複数のスレッドを作成することです。

例: 4 つのファイル、4 つの異なる計算単位 (個別のメモリ、一意のデバイス ID)。各ファイルは、1 つの計算単位で実行されます。

私が今持っているものは次のとおりです。

class Encoder {
[...]
public:
    worker(T data, int devId);
[...]
}

したがって、main() からスレッド化されたワーカーを呼び出すのが最善の方法だと思います

boost::thread w1(&Encoder::worker, data0, 0);
boost::thread w2(&Encoder::worker, data1, 1);
boost::thread w3(&Encoder::worker, data2, 2);
boost::thread w4(&Encoder::worker, data3, 3);

スレッドクラスを実装しないでください。

4

4 に答える 4

2

コンパイラがサポートしている場合は、OpenMPを見てください。これは、コンパイラ フラグを追加して数秒でスプレーするのと同じくらい簡単#pragmaです。

于 2010-03-15T10:00:28.323 に答える
1

上記のコード

  boost::thread w1(&Encoder::worker, data0, 0);

ワーカーが静的になるまで有効ではありません。

次のように、レビュースケジュールにBoost.Taskがあり、呼び出し可能なものを非同期的に呼び出すことができます。

  boost::tasks::async(
    boost::tasks::make_task( &Encoder::worker, data0, 0) ) );

これにより、Encoder::workerがデフォルトのスレッドプールで呼び出されます。この関数は、タスクがいつ実行されたかを知ることができるハンドルを返します。

于 2010-04-19T23:05:20.250 に答える
1

現在の提案は、がである場合Encoder::workerにのみ機能しstaticます。そうだと思います。1つの懸念は、現在の実装がエンコーディングジョブを正常に中止する方法をサポートしている場合です。次の形式のコードにいくつかのメソッドがあると思います。

while( MoreInputSamples ) {
    // Do more encoding
}

これは、ジョブがアボート信号を受信したかどうかをチェックする追加の条件で変更される場合があります。私はビデオデコードによく取り組んでおり、次のようなデコーダークラスが必要です。

class Decoder {
public:
    void DoOneStepOfDecoding( AccessUnit & Input );
}

出力は通常、リングバッファに送られます。このようにして、これをシングルスレッドシナリオとマルチスレッドシナリオの両方で簡単にラップできます。

于 2010-03-15T11:04:09.067 に答える
1

問題はより設計レベルにあると思います。どのクラスがあるかについて少し詳しく説明してもらえますか? 私も CUDA に取り組んでおり、通常はアーキテクチャ固有 (CUDA) レイヤーを使用するためのインターフェイス (別名 Facade パターン) を作成します。

編集:更新インターフェースを読んだ後、あなたは正しいことをしていると思います。Encoder ロジックをクラス内に保持し、プレーンな boost::threads を使用してさまざまな作業単位を実行します。Encoder のメソッド内のスレッド セーフに注意してください。

于 2010-03-15T10:38:44.167 に答える