Async不适用于长向量

时间:2018-04-12 21:23:34

标签: performance c++11 asynchronous optimization

我正在使用async进行一些并行编程。我有一个积分器,在一个测试程序中,我想看看是否将4个子向量中的向量分成四分之一的时间来完成任务。 我有一个关于测量时间的初始问题,现在解决为steady_clock()测量真实而不是CPU时间。

我尝试了不同矢量长度的代码。对于短长度(< 10e5元素),直接积分更快:正常,因为.get()调用和总和花费时间。

对于中间长度(约1e8个元素),积分遵循预期时间,第一次给出1秒,第二次给出0.26秒。

对于长向量(10e9或更高),第二次积分比第一次积分花费的时间多得多,相对于相似或更长的时间超过3秒。

为什么呢?使分而治之的程序变慢的过程是什么?

另外两点注意事项:请注意我通过引用传递向量,因此这不是问题,请记住这是一个测试代码,因此子向量创建不是问题的关键点。 / p>

#include<iostream>
#include<vector>
#include<thread>
#include<future>
#include<ctime>
#include<chrono>

using namespace std;
using namespace chrono;

typedef steady_clock::time_point tt;

double integral(const std::vector<double>& v, double dx) //simpson 1/3
{
  int n=v.size();
  double in=0.;
  if(n%2 == 1) {in+=v[n-1]*v[n-1]; n--;}
  in=(v[0]*v[0])+(v[n-1]*v[n-1]);

  for(int i=1; i<n/2; i++)
      in+= 2.*v[2*i] + 4.*v[2*i+1];

  return in*dx/3.;
}

int main()
{
double h=0.001;
vector<double> v1(100000,h); // a vector, content is not important
// subvectors
vector<double> sv1(v1.begin(), v1.begin() + v1.size()/4), 
           sv2(v1.begin() + v1.size()/4 +1,v1.begin()+ 2*v1.size()/4),
           sv3( v1.begin() + 2*v1.size()/4+1, v1.begin() + 3*v1.size()/4+1), 
           sv4( v1.begin() + 3*v1.size()/4+1, v1.end());

double a,b;
cout << "f1" << endl;
tt bt1 = chrono::steady_clock::now();
// complete integration: should take time t
a=integral(v1, h);

tt et1 = chrono::steady_clock::now();
duration<double> time_span = duration_cast<duration<double>>(et1 - bt1);
cout << time_span.count() << endl;




future<double> f1, f2,f3,f4;
cout << "f2" << endl;
tt bt2 = chrono::steady_clock::now();
// four integrations: should take time t/4
f1 = async(launch::async, integral, ref(sv1), h);
f2 = async(launch::async, integral, ref(sv2), h);
f3 = async(launch::async, integral, ref(sv3), h);
f4 = async(launch::async, integral, ref(sv4), h);
b=f1.get()+f2.get()+f3.get()+f4.get();

tt et2 = chrono::steady_clock::now();
duration<double> time_span2 = duration_cast<duration<double>>(et2 - bt2);
cout << time_span2.count() << endl;

cout << a << "  " << b << endl;
return 0;
}

0 个答案:

没有答案