我有一个令人尴尬的并行问题,我想在多个处理器上执行。我原以为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;
}
boost::thread
默认情况下会使用多个核心,但如果您的线程比调度线程做的工作少,那么您将看不到多线程带来的任何好处。
感谢大家帮助我理解这一点。
答案 0 :(得分:5)
您始终加入队列中的第一个线程。如果这个线程花了很长时间,它可能是剩下的唯一线程。我猜你想要的是在任何线程完成后开始一个新线程。
我不知道为什么你只能获得一个有效的并发级别。
在查看了doWork函数后,我认为它的工作量很少,因此首先开始使用线程所需的工作量较少。尝试运行更多的工作(1000x)。