2017-01-15 7 views
1

私はPOST要求で画像を受信し、処理のためにGPUに送信し、GPUの結果を取得した後、応答を返送する。タスクが完了するまでboost :: asio :: coroutineを返します。

多くの同時接続を処理できるようにするために、boost :: asio :: coroutineを使用するserver4の例(link)に続いて、Boost :: asioを使用しています。私が実行している問題は、コルーチンをブロックしないで、コルーチンからGPUにデータを送信する方法です。

GPUは、一括してリクエストを処理できる場合に最も効率的です。しかし、一度に1つのリクエスト(CPUとメモリIOがコンテキスト・スイッチされてボトルネックになることはありません)を処理する場合でも、次のリクエストを開始する前に完全なリクエストを処理する必要があります。これは、コルーチンから要求をキューに入れ、GPU処理が完了したときに何らかの方法でコルーチンを通知する必要があることを意味します。

boost :: asioリファレンスを見ていますが、何も私に飛び乗っていません。一般的に、レスポンスを即座に生成できない場合(例えば、〜500msかかる場合がある)、ブーストasioコルーチンがどのように使用されますか?これは一般的にどのように行われますか?

答えて

0

GPUとやり取りするプログラムの部分を、独自のスレッドで実行するように設定します。 GPUを必要とするリクエストを受け取ったら、イメージデータをソケットオブジェクトやその他の必要なパラメータとともにボックスに入れ、それをmutex-lockedキューにプッシュします。 gpuスレッドは、キューから引き出して作業を行い、io_serviceで新しいタスクを生成して、構造体に格納されている情報を使用してクライアントとのトランザクションを終了することができます。

condition variableを使用し、作業要求がプッシュされた後にネットワークコードがnotify_one()を呼び出すように、作業が利用可能になるまで、gpuスレッドをスリープに設定できます。

0

あなたが説明しているとおりに動作するもう1つのトリックは、デッドラインタイマーを無期限に設定することです。

その後、GPUタスクから、作業が完了した時刻をキャンセルし、コロを再開します。

+0

を参照してくださいはstackfulまたはスタックレスコルーチンのために、このですか? –

+0

これは非同期操作用です。どのような方法で投稿/完了します。 – sehe

関連する問題