求数组(长度220000)最小值,OpenMp比串行还要慢!为什么?如何才能改进?
双CPU至强E5420(共8核)
下列程序,串行比并行快3倍!
并行程序如下:
static vector<double> ompDblValues(8);
double MinOutputOMP(const vector<double> &outputs)
{
ompDblValues.assign(8, FLT_MAX);
const long n = (long)outputs.size(); //n=220000
#pragma omp parallel for
for (long i=0; i<n; i++)
{
long nThread = omp_get_thread_num();
ompDblValues[nThread] = (ompDblValues[nThread] < outputs[i]) ? ompDblValues[nThread] : outputs[i];
}
double minPositive= FLT_MAX;
for (long i=0; i<omp_get_num_procs(); i++)
{
minPositive = (minPositive < ompDblValues[i]) ? minPositive : ompDblValues[i];
}
return minPositive;
}
串行程序如下:
double MinOutput(const vector<double> &outputs)
{
double minPositive= FLT_MAX;
const long n = (long)outputs.size(); //n=220000
for (int i=0; i<n; i++)
{
minPositive = (minPositive < outputs[i]) ? minPositive : outputs[i];
}
return minPositive;
}