我刚刚读了this intro与openMP并行处理。为什么不是多线程循环更快?
我尝试以下简单的代码
#include <iostream>
#include <ctime>
#include <vector>
int main()
{
// Create an object just to allow the following loops to do something
std::vector<int> a;
a.reserve(2000);
// First single threaded loop
std::clock_t begin;
std::clock_t end;
begin = std::clock();
double elapsed_secs;
for(int n=0; n<1000000000; ++n)
{
if (n%100000000 == 0) a.push_back(n);
}
end = std::clock();
elapsed_secs = double(end - begin)/CLOCKS_PER_SEC;
std::cout << "Time for single thread loop: " << elapsed_secs << std::endl;
// Second multithreaded loop
begin = std::clock();
#pragma omp parallel for
for(int n=0; n<1000000000; ++n)
{
if (n%100000000 == 0) a.push_back(n);
}
end = std::clock();
elapsed_secs = double(end - begin)/CLOCKS_PER_SEC;
std::cout << "Time for multi thread loop: " << elapsed_secs << std::endl;
return 0;
}
已编译g++ -std=c++11 -o a a.cpp -fopenmp
其输出
Time for single thread loop: 3.9438
Time for multi thread loop: 3.94977
- 难道我误解如何并行在C++
- 难道我误解如何编译?
- 代码是否并行,但速度的提高并不明显,无论出于何种原因?
请注意,我的机器上有12个内核(并且没有大的进程正在运行)。
它可能是一个优化问题? –
你有一个依赖关系,因为'a'在每个循环处理之间是通用的。 – Jarod42
什么是更快,翻转开关千次或有千人谁每次翻转同一开关一次?我很惊讶平行版本并不慢。猜测OMP做了理智的事情,并没有产生任何额外的线程。 –