假设我有这样的代码
for(i = 0; i < i_max; i++)
for(j = 0; j < j_max; j++)
// do something
我想通过使用不同的线程来做到这一点(假设//do something 任务彼此独立,例如考虑 montecarlo 模拟)。我的问题是:为每个 i 值创建一个线程是否一定比为每个 j 值创建一个线程更好?像这样
for(i = 0; i < i_max; i++)
create_thread(j_max);
另外:合适的线程数是多少?我应该只创建 i_max 线程,还是使用信号量,其中 k < i_max 线程在任何给定时间同时运行。
谢谢,
最佳答案
分配工作量的最佳方式取决于工作量。
广义上 - 对于可并行的工作负载,使用 OpenMP;对于异构工作负载,使用线程池。如果可以,请避免管理自己的线程。
蒙特卡洛模拟应该是真正并行代码而不是线程池的一个很好的候选者。
顺便说一下 - 如果您使用的是 Visual C++,Visual C++ v10 中有一个有趣的新 Concurrency Runtime正是针对这类问题。这有点类似于添加到 .Net Framework 4 以简化多核/多 CPU 代码实现的任务并行库。
关于c++ - 多线程效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4432968/