多处理器Boost :: Thread?所有线程都在一个处理器上运行

fli*_*ies 4 c++ parallel-processing multithreading boost boost-thread

我有一个令人尴尬的并行问题,我想在多个处理器上执行.我本以为boost::thread会自动将新线程发送到新处理器,但所有这些线程都在与父进程相同的核心上执行.是否可以让每个线程在不同的处理器上运行,还是需要像MPI这样的东西?

我怀疑这boost::thread不是一个多处理器工具,我要求它做一些不是为它设计的东西.

编辑:我的问题归结为:为什么所有线程都在一个处理器上执行?有没有办法让boost::thread线程发送到不同的处理器?

这是我的代码的相关示例:

size_t lim=1000;
std::deque<int> vals(lim);
std::deque<boost::thread *> threads;
int i=0; 
std::deque<int>::iterator it = vals.begin();
for (; it!=sigma.end(); it++, i++) {
  threads.push_back(new boost::thread(doWork, it, i));
  while (threads.size() >= maxConcurrentThreads) {
    threads.front()->join();
    delete threads.front();
    threads.pop_front();
  }
}
while(threads.size()) {
  threads.front()->join();
  threads.pop_front();
}
Run Code Online (Sandbox Code Playgroud)

应该清楚,doWork使用参数进行一些计算i并将结果存储在中vals.我的想法是设置maxConncurrentThreads为等于可用核心数,然后每个线程将使用空闲的核心.我只需要有人确认boost::thread不能以这种方式工作.

(我猜想有一种更好的方法来限制并发线程的数量而不是使用队列;也可以随意骂我.)


这是doWork功能:

void doWork(std::deque<int>::iterator it, int i) {
  int ret=0;
  int size = 1000; // originally 1000, later changed to 10,000,000
  for (int j=i; j<i+size; j++) {
    ret+=j;
  }
  *it=ret;
  return;
}
Run Code Online (Sandbox Code Playgroud)

编辑:正如Martin James所说,问题在于doWork函数最初只有1000个int添加.由于这么小的工作,调度线程花费的时间比执行线程要长,因此只使用了一个处理器.延长工作时间(增加10,000,000英寸)可以产生理想的行为.关键是:默认情况下boost::thread 使用多个内核,但如果您的线程比调度线程的工作少,那么您将看不到多线程的任何好处.

感谢大家帮助我理解这一点.

usr*_*usr 5

您始终加入队列中的第一个线程.如果这个线程花了很长时间,它可能是剩下的唯一线程.我想你想要的是在任何线程完成后开始一个新线程.

我不知道为什么你只能获得一个有效的并发级别.

在查看了doWork函数之后,我认为它所做的工作很少,所以它比起初创建一个线程所花费的工作少.尝试运行更多的工作(1000x).

  • 一起添加1000个数字?该线程可能在您创建第二个线程时完成,因此第二个线程可能在同一个核心上运行,因为该核心已经设置了进程上下文.做一些较重的工作! (3认同)
  • 实际上,我的建议是使用线程池.它将为您处理所有这些.http://stackoverflow.com/questions/4084777/creating-a-thread-pool-using-boost (2认同)