多处理器加速::线程?所有线程都在一个处理器上运行
Multiprocessor Boost::Thread? All threads running on one processor
我有一个令人尴尬的并行问题,我想在多个处理器上执行。 我原以为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
将使用多个内核,但是如果您的线程所做的工作少于调度线程,那么您将不会看到多线程的任何好处。
感谢大家帮助我理解这一点。
您始终加入队列中的第一个线程。如果此线程花费很长时间,则可能是剩下的唯一线程。我想你想要的是在任何线程完成后启动一个新线程。
我不知道为什么你只得到一个有效的并发级别。
在查看了doWork功能之后,我认为它所做的工作很少,以至于它首先花费的工作量比启动线程要少。尝试通过更多工作 (1000x) 运行它。
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 当我在其中一个线程执行中(在activemq-cpp中)捕获到特定值时,我如何终止/停止所有其他线程
- 试图创建一个多线程程序来查找0-100000000之间的总素数
- 为什么一个向量上的多线程操作很慢
- 在另一个线程中调用luaL_error会引发qWarning
- 全局变量 多读取器 一个写入器多线程安全?
- C++一个线程如何正确通信其任务已完成?
- 最佳做法是从另一个线程访问 qml 中的Q_PROPERTY
- C++线程:如何在一个线程仍在运行时阻止另一个线程执行 (Win32)
- 是否可以创建一个从不同类调用函数的线程?
- 如何制作一个只能在一个线程上同时执行的函数?
- 结束另一个线程中使用的对象的生存期
- C++线程安全:如果只有一个线程可以写入非原子变量,但多个线程从中读取. 会遇到问题吗?
- 一个线程等待多个线程事件
- 两个线程一个使用流 Api,另一个线程创建文件失败并出现错误ERROR_SHARING_VIOLATION
- C 两个线程一个用于输入,一个用于输出
- 2个线程 - 一个带有OpenGL窗口的线程,第二个带有WXWIDGETS的窗口
- 每个线程一个类实例,C++11
- 多线程-一个作家和一个读者-我们需要使用储物柜吗
- Cuda如何从全局函数运行多个线程?一个运行多个线程的内核