求数组(长度220000)最小值,OpenMp比串行还要慢!为什么?如何才能改进?

bigbigknife 2008-11-20 01:05:22
双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;
}
...全文
333 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
bigbigknife 2008-12-09
  • 打赏
  • 举报
回复
我指的是后面那句“看来你只能自己做相应的操作了,或者来个混合编程。”。
这句话什么意思?
算了,我估计这个问题是没的解了,呵呵。

[Quote=引用 12 楼 intel_www 的回复:]
引用 11 楼 bigbigknife 的回复:
别老是含含糊糊,到底行不行啊?写个管用的代码来看看吧。

引用 10 楼 intel_www 的回复:
不好意思,openmp只在fortran语言中提供了min和max的reduction操作。看来你只能自己做相应的操作了,或者来个混合编程。


说的不是很清楚吗?fortran里支持min和max的REDUCTION操作,因为语言本身提供了这个INTRINSIC操作.C和C++不支持,因为语言里没有这个操作。

还有,看了你另外一个帖…
[/Quote]
intel_www 2008-12-09
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 bigbigknife 的回复:]
别老是含含糊糊,到底行不行啊?写个管用的代码来看看吧。

引用 10 楼 intel_www 的回复:
不好意思,openmp只在fortran语言中提供了min和max的reduction操作。看来你只能自己做相应的操作了,或者来个混合编程。
[/Quote]

说的不是很清楚吗?fortran里支持min和max的REDUCTION操作,因为语言本身提供了这个INTRINSIC操作.C和C++不支持,因为语言里没有这个操作。

还有,看了你另外一个帖子里的代码片断,那个函数外提操作写的是对的。但是你的测试数据长度太小了!220000个元素的最小值操作串行时间小余0.01秒,并行化后线程创建和同步等的额外开销比这个都长。你把数据长度扩大1000倍后再测测外提有没有效果?
bigbigknife 2008-12-08
  • 打赏
  • 举报
回复
别老是含含糊糊,到底行不行啊?写个管用的代码来看看吧。

[Quote=引用 10 楼 intel_www 的回复:]
不好意思,openmp只在fortran语言中提供了min和max的reduction操作。看来你只能自己做相应的操作了,或者来个混合编程。
[/Quote]
intel_www 2008-12-08
  • 打赏
  • 举报
回复
不好意思,openmp只在fortran语言中提供了min和max的reduction操作。看来你只能自己做相应的操作了,或者来个混合编程。
bigbigknife 2008-12-08
  • 打赏
  • 举报
回复
这个回复太崩溃了,呵呵!
这个东西谁都有呀。
要不,你要是有问题,我就回答 www.openmp.org/ 。


[Quote=引用 8 楼 intel_www 的回复:]
引用 6 楼 bigbigknife 的回复:
怎么用reduction操作?reduction我只知道累加、累减等操作。
谢谢!

引用 4 楼 intel_www 的回复:
第二点:

求最小值可以用reduction操作,不需要为每一个线程手工分配一个最小值记录变量。另外,代码中的线程用来保存自己最小值得方法会引起false-sharing问题:就是并行执行的多个线程同时去写同一个cache line的不同部分,这样会引起大量的cache写回memory的操作。这样是很耗时的。…
[/Quote]
intel_www 2008-12-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 bigbigknife 的回复:]
怎么用reduction操作?reduction我只知道累加、累减等操作。
谢谢!

引用 4 楼 intel_www 的回复:
第二点:

求最小值可以用reduction操作,不需要为每一个线程手工分配一个最小值记录变量。另外,代码中的线程用来保存自己最小值得方法会引起false-sharing问题:就是并行执行的多个线程同时去写同一个cache line的不同部分,这样会引起大量的cache写回memory的操作。这样是很耗时的。
[/Quote]

授人以鱼不如授人以渔。请见http://www.openmp.org/mp-documents/spec30.pdf
intel_www 2008-12-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 bigbigknife 的回复:]
不这么用,该怎么用呢?

引用 3 楼 intel_www 的回复:
首先说第一个问题:

long nThread = omp_get_thread_num();

这么明显的一个函数调用放在循环之内怎么能不影响性能呢?
[/Quote]

把这个函数调用手工提到循环外面去呀。openmp中的parallel region又不是只能包含一个for循环。
bigbigknife 2008-12-06
  • 打赏
  • 举报
回复
怎么用reduction操作?reduction我只知道累加、累减等操作。
谢谢!

[Quote=引用 4 楼 intel_www 的回复:]
第二点:

求最小值可以用reduction操作,不需要为每一个线程手工分配一个最小值记录变量。另外,代码中的线程用来保存自己最小值得方法会引起false-sharing问题:就是并行执行的多个线程同时去写同一个cache line的不同部分,这样会引起大量的cache写回memory的操作。这样是很耗时的。
[/Quote]
bigbigknife 2008-12-06
  • 打赏
  • 举报
回复
不这么用,该怎么用呢?

[Quote=引用 3 楼 intel_www 的回复:]
首先说第一个问题:

long nThread = omp_get_thread_num();

这么明显的一个函数调用放在循环之内怎么能不影响性能呢?
[/Quote]
intel_www 2008-11-24
  • 打赏
  • 举报
回复
首先说第一个问题:

long nThread = omp_get_thread_num();

这么明显的一个函数调用放在循环之内怎么能不影响性能呢?
intel_www 2008-11-24
  • 打赏
  • 举报
回复
第二点:

求最小值可以用reduction操作,不需要为每一个线程手工分配一个最小值记录变量。另外,代码中的线程用来保存自己最小值得方法会引起false-sharing问题:就是并行执行的多个线程同时去写同一个cache line的不同部分,这样会引起大量的cache写回memory的操作。这样是很耗时的。
intel_iclifort 2008-11-23
  • 打赏
  • 举报
回复
又是一个内存访问的问题
bigbigknife 2008-11-23
  • 打赏
  • 举报
回复
本版专家如云,怎么区区这么个小问题都没人回应?

567

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧