【发布时间】:2014-06-08 23:11:35
【问题描述】:
我一直在 OpenMP 中调用它
#pragma omp parallel for num_threads(totalThreads)
for(unsigned i=0; i<totalThreads; i++)
{
workOnTheseEdges(startIndex[i], endIndex[i]);
}
这在 C++11 std::threads 中(我相信那些只是 pthreads)
vector<thread> threads;
for(unsigned i=0; i<totalThreads; i++)
{
threads.push_back(thread(workOnTheseEdges,startIndex[i], endIndex[i]));
}
for (auto& thread : threads)
{
thread.join();
}
但是,OpenMP 实现是速度的 2 倍——更快!我本来希望 C++11 线程更快,因为它们更底层。注意:上面的代码不仅被调用了一次,而且可能在一个循环中被调用了 10,000 次,所以也许这与它有关?
编辑:为了澄清,在实践中,我要么使用 OpenMP 要么使用 C++11 版本——而不是两者。当我使用 OpenMP 代码时,需要 45 秒,而当我使用 C++11 时,需要 100 秒。
【问题讨论】:
-
大概OpenMP不会生成数千个线程...
-
我的水晶球无法显示
totalThreads的值是多少,您的CPU 有多少个内核/硬件线程,startIndex的大小是多少以及执行@ 需要多少时间987654326@一次。 -
他们没有做同样的事情。 OpenMP 版本在 16 个线程上分配 10,000 个任务。 C++11 版本在 10,000 个线程上运行 10,000 个任务。线程很昂贵,拥有比内核更多的线程甚至更昂贵。您不能只在每个小任务上抛出新线程(除非您碰巧有 10,000 个左右的内核来运行它们)。 OpenMP 版本会为您解决这个问题。
-
@user2588666:你说“上面的代码是循环调用的”。每次调用时,
std::thread版本都会创建totalThreadsnew 线程,但OpenMP每次循环执行时都会重用相同的 16 个线程。 -
@user2588666:Visual Studio 实现
std::async以重用相同的线程。除此之外,您必须自己管理 16 个线程(这对您的情况来说非常容易。将threads向量设为静态:coliru.stacked-crooked.com/a/3fdad471c0c26d41)
标签: c++ multithreading c++11