3
我在使用平行标量生成两个向量并测量已用时间。 我比较顺序VS并行标量积:优化计算时间
SEQ:平行double scalar(int n, double x[], double y[])
for (int i=0; i<n; i++)
{
sum += x[i]*y[i];
}
:double scalar_shm(int n, double x[], double y[])
#pragma omp parallel for private(i) shared(x,y) reduction(+:sum)
for (i=0; i<n; i++)
{
sum += x[i]*y[i];
}
我称这些一个接一个:
//sequential loop
for (int n=0; n<loops; n++)
{ scalar(vlength,x,y); }
//measure sequential time
t1 = omp_get_wtime() - tstart;
//parallel loop
for (int n=0; n<loops; n++)
{ scalar_shm(vlength,x,y); }
//measure parallel time
t2 = omp_get_wtime() - t1 - tstart;
//print the times elapsed
cout<< "total time (sequential): " <<t1 <<" sec" <<endl;
cout<< "total time (parallel ): " <<t2 <<" sec" <<endl;
每个周期我用随机双打填充矢量,我删除了那部分,因为我认为它是不相关的。
这个输出是:
total time (sequential): 15.3439 sec
total time (parallel ): 24.5755 sec
我的问题是,为什么是一个平行的慢?如果速度较慢,有什么好处?我预计它会更快,因为我认为像这样的计算就是它的重点。
注:我跑这对英特尔酷睿i7-740QM
你有没有考虑告诉我们您的载体有多大和(在较小的延伸)你在做多少次迭代?这可能是有用的信息(考虑到性能权衡会随着大小而变化)。 – Grizzly
输出用于:vlength = 500000;循环= 1000; – Kolt
好吧,现在我删除了循环中填充矢量的循环中的随机填充,并在每个循环中标量生成了相同的矢量,现在输出为:总时间(连续):2.42854秒 总时间(平行):1.028秒相同的长度和循环号码。它不应该是无关紧要的吗? – Kolt