在共享内存并行化方面,大多数科学计算人员使用OpenMP作为准标准.
是否有任何理由(除了可读性)使用OpenMP而不是pthreads?后者似乎更基本,我怀疑它可以更快更容易优化.
在以下示例中,C++ 11线程执行大约需要50秒,但OMP线程仅需5秒.有什么想法吗?(我可以向你保证,如果你正在做真正的工作而不是doNothing,或者如果你以不同的顺序进行,那么它仍然适用.)我也在16核机器上.
#include <iostream>
#include <omp.h>
#include <chrono>
#include <vector>
#include <thread>
using namespace std;
void doNothing() {}
int run(int algorithmToRun)
{
auto startTime = std::chrono::system_clock::now();
for(int j=1; j<100000; ++j)
{
if(algorithmToRun == 1)
{
vector<thread> threads;
for(int i=0; i<16; i++)
{
threads.push_back(thread(doNothing));
}
for(auto& thread : threads) thread.join();
}
else if(algorithmToRun == 2)
{
#pragma omp parallel for num_threads(16)
for(unsigned i=0; i<16; i++)
{
doNothing();
}
}
}
auto endTime = std::chrono::system_clock::now();
std::chrono::duration<double> elapsed_seconds = endTime - …Run Code Online (Sandbox Code Playgroud) 我正在为科学计算社区开发代码,特别是迭代地求解线性方程组(Ax = b形式).
我已经使用BLAS和LAPACK进行原始矩阵子程序,但我现在意识到有一些手动并行化的余地.我正在开发一个共享内存系统,它有两个选择:OpenMP和PThreads.
假设时间不是最大的因素(代码的性能),这是一个更好的,未来的证明,也许是可移植的(到CUDA)并行化的方式?花在使用Pthreads上花费的时间是否值得提升?
我相信我的应用程序(基本上处理一次启动许多事情,然后根据所有这些"最佳"值运行)将受益于显式线程控制,但我担心编码会占用太多时间并且最终将没有绩效回报.
我已经在这里看过几个类似的问题,但它们都与一般应用有关.
这个涉及Linux中的通用多线程应用程序.
这也是一个普遍的问题.
我知道SciComp.SE,但觉得这里的主题更多.