【问题标题】:Multiprocessor Boost::Thread? All threads running on one processor多处理器提升::线程?所有线程在一个处理器上运行
【发布时间】:2012-05-06 08:27:03
【问题描述】:

我有一个令人尴尬的并行问题,我想在多个处理器上执行。我原以为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();
}

应该清楚,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;
}

编辑:正如 Martin James 所建议的,问题在于 doWork 函数最初只有 1000 个 int 加法。对于这么小的作业,调度线程比执行线程花费的时间更长,因此只使用了一个处理器。使工作更长(添加 10,000,000 个整数)会产生所需的行为。重点是:boost::thread 默认使用多个内核,但是如果您的线程做的工作比调度线程少,那么您将看不到多线程的任何好处。

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

【问题讨论】:

  • 对,多线程和多处理是完全不同的概念,boost::thread支持前者。
  • 对我来说听起来像 MPI...欢迎来到我的世界!
  • 我认为这与 MPI 无关,他只是将多处理器和多核系统这两个词混为一谈。
  • @juanchopanza 我理解你是说boost::thread 不能将每个线程发送到不同的核心。对吗?
  • 通常,您可以通过聆听来判断这样的事情是否有效。如果我用 8 个 100% CPU 线程加载我的机器,CPU 风扇会在几秒钟内启动。

标签: c++ multithreading boost parallel-processing boost-thread


【解决方案1】:

您总是加入队列中的第一个线程。如果这个线程需要很长时间,它可能是唯一剩下的线程。我猜你想要的是在 any 线程完成后启动一个新线程。

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

在查看了 doWork 函数后,我认为它所做的工作非常少,以至于它所花费的工作比一开始就启动一个线程要少。尝试用更多的工作(1000 倍)运行它。

【讨论】:

  • 你把dequequeue混在一起了吗?
  • 代码只有在threads.size() &gt;= maxConcurrentThreads时才开始加入。
  • @megabyte1024 没关系,因为如果双端队列中的第一个线程比其他线程花费更长的时间,那么所有其他线程将在第一个线程之前完成,并且一次运行的唯一线程是第一个一。
  • 其实我的建议是使用线程池。它会为你处理这一切。 stackoverflow.com/questions/4084777/…
  • 1000 个数字相加?该线程可能在您创建第二个线程时完成,因此第二个线程很可能在同一个核心上运行,因为该核心已经设置了进程上下文。做一些更重的工作!
猜你喜欢
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-31
  • 1970-01-01
  • 1970-01-01
  • 2020-02-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多