2012-12-15 104 views
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

+1

你有没有考虑告诉我们您的载体有多大和(在较小的延伸)你在做多少次迭代?这可能是有用的信息(考虑到性能权衡会随着大小而变化)。 – Grizzly

+0

输出用于:vlength = 500000;循环= 1000; – Kolt

+0

好吧,现在我删除了循环中填充矢量的循环中的随机填充,并在每个循环中标量生成了相同的矢量,现在输出为:总时间(连续):2.42854秒 总时间(平行):1.028秒相同的长度和循环号码。它不应该是无关紧要的吗? – Kolt

回答

1

你正在创建和销毁每个迭代一个新的平行的部分代码。这个操作非常缓慢。你可以尝试建立内部循环外并行段:

//parallel loop 
int sum; 
#pragma omp parallel private(n) reduction(+:sum) 
{ 
    for (int n=0; n<loops; n++) 
    { 
     scalar_shm(vlength,x,y, sum); 
    } 
} 

内scalar_shm功能,OpenMP的编译是:

#pragma omp for private(i) 
for (i=0; i<n; i++) 
{ 
    sum += x[i]*y[i]; 
}