【发布时间】:2017-04-16 17:06:25
【问题描述】:
我刚刚阅读了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在每个循环处理之间是通用的。 -
哪个更快,将一个开关拨动一千次,还是让数千人每人拨动同一个开关一次?我很惊讶并行版本并不慢。猜猜 OMP 做了理智的事情,没有产生任何额外的线程。
-
我尝试将
a.push_back(n);替换为std::cout << n << std::endl;,但性能仍然没有差异 -
好的,所以不是按一千次名为“a”的同一个开关,而是尝试按一千次名为“std::cout”的开关。提示:std::cout 是单个对象。
标签: c++ multithreading c++11 multiprocessing