4

これは本当に簡単だと思いますが、Java でそれを行う単純な方法があるかどうかはわかりません。これが私の問題です。データを処理するための 2 つのスクリプトがあり、どちらも同じ入力/出力を持っていますが、1 つは単一の CPU 用に作成され、もう 1 つは GPU 用に作成されています。仕事はキューサーバーから来ており、どちらが空いているかに応じて、データを CPU または GPU スクリプトのいずれかに送信するプログラムを作成しようとしています。

これを行う方法がわかりません。

executorservice を使用すると、実行し続けるスレッドの数を指定できることはわかっていますが、2 つの異なるスレッドのバランスを取る方法がわかりません。システムに 2 つの GPU と 8 つの CPU コアがあり、threadexecutorservice で 2 つの GPU と 8 つの CPU プロセスを実行し続けることができると考えましたが、GPU は CPU タスクよりもはるかに速く実行されるため、それらの間のバランスをとる方法がわかりません。

これにアプローチする方法について何か提案はありますか? 2 つのキューを作成し、それらをプールし続けて、どちらがビジーでないかを確認する必要がありますか? または、すべてのワークユニット(すべて同じ)を1つのキューに入れ、GPUまたはCPUプロセスを同じキューから解放する方法はありますか?

更新:明確にするために。CPU/GPU プログラムは、私が作成しているプログラムの範囲外です。これらは、2 つの異なる方法で呼び出す単なるスクリプトです。私が求めていることの単純化されたバージョンは、2 つのメソッドが同じキューから作業を取得できるかどうかだと思いますか?

4

4 に答える 4

2

2 つのメソッドが同じキューから作業を取得できますか?

はい。ただし、BlockingQueue同期の手間を省くために を使用する必要があります。

基本的に、1 つのオプションは、 を介してタスクをキューに配置するプロデューサーを持つことBlockingQueue.offerです。次に、受け取ったものを呼び出して処理を実行するように CPU/GPU スレッドを設計しますBlockingQueue.take

例えば:

main (...) {
    BlockingQueue<Task> queue = new LinkedBlockingQueue<>();


    for (int i=0;i<CPUs;i++) {
        new CPUThread(queue).start();
    }

    for (int i=0;i<GPUs;i++) {
        new GPUThread(queue).start();
    }

    for (/*all data*/) {
        queue.offer(task);
    }
}
class CPUThread {
    public void run() {
        while(/*some condition*/) {
            Task task = queue.take();
            //do task work
        }
    }
}
//etc...
于 2013-02-12T07:39:31.580 に答える
1

明らかに、それを行うには複数の方法がありますが、通常は最も単純な方法が最適です。スレッドプールをお勧めします。1つはCPUタスク用に2つのスレッドで、2つ目は8つのスレッドでGPUタスクを実行します。ワークユニットマネージャーは、現在アイドル状態のスレッドがあるプールに作業を送信できます(そのコードブロックを同期することをお勧めします)。標準のJavaThreadPoolExecutorには、使用できるgetActiveCount()メソッドがあります 。http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ThreadPoolExecutor.html#getActiveCount()を参照してください。

于 2013-02-11T17:07:09.563 に答える
1

と のようなメソッドを持つ 2 つの GPU を表す 2 つのオブジェクトがあるとしboolean isFree()ますvoid execute(Runnable)。次に、ループ内でキューから次のジョブを取得し、空いている GPU がある場合はそれを配置し、そうでない場合はジョブ自体を実行する 8 つのスレッドを開始する必要があります。

于 2013-02-12T07:22:50.493 に答える