平衡多个队列

时间:2013-02-11 15:35:57

标签: java multithreading

我怀疑这很容易,但我不确定在Java中是否有一种天真的方式。这是我的问题,我有两个处理数据的脚本,两个都有相同的输入/输出,除了一个写入单CPU,另一个写入GPU。这项工作来自一个队列服务器,我正在尝试编写一个程序,将数据发送到CPU或GPU脚本,具体取决于哪个是免费的。

我不明白该怎么做。

我知道有了executorservice我可以指定我想继续运行多少个线程,但不知道如何在两个不同的线程之间取得平衡。我在系统上有2个GPU和8个CPU内核,并且认为我可以让threadexecutorservice保持2个GPU和8个CPU进程运行,但不确定如何平衡它们,因为GPU将比CPU任务更快地完成。

有关如何处理此问题的任何建议?我应该创建两个队列并继续汇集它们以查看哪个队列不太忙吗?或者有没有办法将所有工作单元(都是相同的)放入一个队列,并让GPU或CPU进程从同一个队列获取,因为它们是免费的?

更新:只是为了澄清。 CPU / GPU程序超出了我正在制作的程序范围,它们只是我通过两种不同方法调用的脚本。我想我所问的简化版本是两个方法可以从同一个队列中工作吗?

4 个答案:

答案 0 :(得分:2)

  

两个方法可以从同一个队列中工作吗?

是的,但您应该使用BlockingQueue来节省一些同步心痛。

基本上,一个选项是让生产者通过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...

答案 1 :(得分:1)

像这样使用Runnables:

CPUGPURunnable implements Runnable {
  run() {
    if ( Thread.currentThread() instance of CPUGPUThread) {
      CPUGPUThread t = Thread.currentThread();
      if ( t.isGPU())
        runGPU();
      else
        runCPU();
    }
  }
}

CPUGPUThreads是一个Thread子类,它使用标志知道它是在CPU还是GPU模式下运行。为ThreadPoolExecutors创建一个ThreadFactory,创建一个GPU线程的CPU。设置一个包含两个worker的ThreadPoolExecutor。确保Threadfactory创建一个CPU,然后创建一个GPU线程实例。

答案 2 :(得分:1)

显然,有不止一种方法可以做到这一点,通常最简单的方法是最好的。我建议使用线程池,一个用于CPU任务的2个线程,第二个用于8个线程的线程池将运行GPU任务。您的工作单位经理可以将工作提交到当前具有空闲线程的池(我建议同步该代码块)。标准Java ThreadPoolExecutor有你可以使用的getActiveCount()方法,请参阅 http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ThreadPoolExecutor.html#getActiveCount()

答案 3 :(得分:1)

我想你有两个代表两个GPU的对象,使用boolean isFree()void execute(Runnable)等方法。然后你应该启动8个线程,它们在循环中从队列中获取下一个作业,将它放在一个免费的GPU中,如果有的话,否则自己执行作业。

相关问题