高人帮看一下,openMP并行了以后怎么反而慢了

kafkafka 2010-03-04 09:35:03
加精
DWORD startTime,endTime;

double x,y,i,j;
long count=0,count1=0,count2=0;

startTime=timeGetTime();

#pragma omp parallel sections
{
#pragma omp section
{
for(x=0;x<=0.5;x+=0.0001)
for(y=0;y<=1;y+=0.0001)
{
if(x*x+y*y<=1) count1++;
}
}
#pragma omp section
{
for(i=0.5001;i<=1;i+=0.0001)
for(j=0;j<=1;j+=0.0001)
{
if(i*i+j*j<=1) count2++;
}
}
}
count=count1+count2;
endTime=timeGetTime();

cout << endl << "Calculations took " << endTime-startTime << "ms.\n";

在vs2008下,打开openMP开关比关闭openMP开关慢了2倍多。就是并行比串行慢了2倍多,为什么呢?并行的2段代码毫无数据相关性啊?
...全文
6063 64 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
64 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhoushengyan 2012-06-18
  • 打赏
  • 举报
回复 1
为什么会是这样呢?先思考一下,其实原因很简单,编译器发现你的for循环下面是对同一个变量进行操作,这样,虽然八核都被调用起来了,但只要一个核在执行count1++;,其他的核都会锁死并等待执行完成,这样,所消耗的时间反而更长了。所以在调用多核编程的时候,切记需要并行运算的部分里不能存在这对同一个变量进行操作,这样,编译器会发现这种称为“变量冲突”的操作方式,编译器会拒绝这么操作!因为这样很危险!多核不可能同时写一个地址!!!
yasaka 2011-12-24
  • 打赏
  • 举报
回复
[Quote=引用 62 楼 kafkafka 的回复:]

自己顶一下,我把x、y、i、j的定义改写到for循环中,也就是从全局变量变成局部变量,定义count1和count2时中间加入char space[64]; 使count1和count2不在同一cache行。这样克服了cache伪共享,执行时间就很理想了,加速比接近2。串610ms,并328ms。代码如下:

DWORD startTime,endTime;

//double x,y……
[/Quote]
深受启发,学习了!
roc7890 2011-04-28
  • 打赏
  • 举报
回复
// Test123444.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <stdio.h>
#include <math.h>
#include <Windows.h>
#include <iostream>
#include <omp.h>
using namespace std;



int _tmain(int argc, _TCHAR* argv[])
{
double startTime = 0;
double endTime = 0;

//double x,y,i,j;
long count=0;

long count1=0;
long count2=0;

startTime= omp_get_wtime();

//
#pragma omp parallel sections
{
#pragma omp section
{
long tcount = 0;
for(double x=0;x<=0.5;x+=0.0001)
for(double y=0;y<=1;y+=0.0001)
{
if(x*x+y*y<=1) tcount++;
}
count1 = tcount;

}
#pragma omp section
{
long tcount = 0;
for(double i=0.5001;i<=1;i+=0.0001)
for(double j=0;j<=1;j+=0.0001)
{
if(i*i+j*j<=1) tcount++;
}
count2 = tcount;
}
}

count = count1+count2;


endTime= omp_get_wtime();
cout<< "count = "<<count ;

cout << endl << "Calculations took " << endTime-startTime << "s.\n";

getchar();

return 0;

}

wolcott2387 2010-03-12
  • 打赏
  • 举报
回复
学习了..............
Snsc 2010-03-12
  • 打赏
  • 举报
回复
學習了
kafkafka 2010-03-12
  • 打赏
  • 举报
回复 1
自己顶一下,我把x、y、i、j的定义改写到for循环中,也就是从全局变量变成局部变量,定义count1和count2时中间加入char space[64]; 使count1和count2不在同一cache行。这样克服了cache伪共享,执行时间就很理想了,加速比接近2。串610ms,并328ms。代码如下:

DWORD startTime,endTime;

//double x,y,i,j;
long count=0,count1=0;
char space[64];
long count2=0;

startTime=timeGetTime();

#pragma omp parallel sections
{
#pragma omp section
{
for(double x=0;x <=0.5;x+=0.0001)
for(double y=0;y <=1;y+=0.0001)
{
if(x*x+y*y <=1) count1++;
}
}
#pragma omp section
{
for(double i=0.5001;i <=1;i+=0.0001)
for(double j=0;j <=1;j+=0.0001)
{
if(i*i+j*j <=1) count2++;
}
}
}
count=count1+count2;
endTime=timeGetTime();

cout < < endl < < "Calculations took " < < endTime-startTime < < "ms.\n";

洛尔烈焰 2010-03-12
  • 打赏
  • 举报
回复
count1和count2的问题,需要对他们进行加锁和解锁。
Yexi1473 2010-03-11
  • 打赏
  • 举报
回复
枷锁解锁··
gzpyming 2010-03-11
  • 打赏
  • 举报
回复
五明!所以需要更加深入的学习
paratera35 2010-03-11
  • 打赏
  • 举报
回复
帮顶一下,好东东大家分享哦!

http://www.paratera.com/Article_pro.asp?channel=5&classid=6&classname=%E4%BB%A3%E7%90%86%E8%BD%AF%E4%BB%B6
paratera35 2010-03-11
  • 打赏
  • 举报
回复
帮顶一下,好东东大家分享哦!

http://www.paratera.com/Article_pro.asp?channel=5&classid=6&classname=%E4%BB%A3%E7%90%86%E8%BD%AF%E4%BB%B6
skybj404182603 2010-03-11
  • 打赏
  • 举报
回复
路过。。。。。。。。。。。。。。。。。灌水
zhang_qwect 2010-03-11
  • 打赏
  • 举报
回复
还不是很懂,但也顶一下
Suese 2010-03-11
  • 打赏
  • 举报
回复
最近我也在研究OpenMP,我也碰到这个问题,经过仔细研究后发现,确实是资源调度的问题

2楼和34楼都是一针见血,在并行区域需要把平凡调用的变量设为私有,经测试,效率大大提高
dwl723696524 2010-03-10
  • 打赏
  • 举报
回复
还不是很懂,但也顶一下
  • 打赏
  • 举报
回复
不懂,帮楼主顶下吧
回复内容太短了回复内容太短了
feilong0309 2010-03-10
  • 打赏
  • 举报
回复
在dos进入windows时,从borland c++的dos版(3.1)到win版(4.x),感觉没什么太多的跃变;
看过一点vb(4?),然后就遇到了以前turbo pascal的接班人:Delphi 1.0!
从而走上不归路,15年来就没再改攻其他语言,主要是用过delphi之后的一览众山小(或者说除却巫山不是云)——当然,也许深层的原因是个
feilong0309 2010-03-10
  • 打赏
  • 举报
回复
在dos进入windows时,从borland c++的dos版(3.1)到win版(4.x),感觉没什么太多的跃变;
看过一点vb(4?),然后就遇到了以前turbo pascal的接班人:Delphi 1.0!
从而走上不归路,15年来就没再改攻其他语言,主要是用过delphi之后的一览众山小(或者说除却巫山不是云)——当然,也许深层的原因是个
feilong0309 2010-03-10
  • 打赏
  • 举报
回复
在dos进入windows时,从borland c++的dos版(3.1)到win版(4.x),感觉没什么太多的跃变;
看过一点vb(4?),然后就遇到了以前turbo pascal的接班人:Delphi 1.0!
从而走上不归路,15年来就没再改攻其他语言,主要是用过delphi之后的一览众山小(或者说除却巫山不是云)——当然,也许深层的原因是个
zzggzc 2010-03-10
  • 打赏
  • 举报
回复
路过 顶一下了 哈哈
加载更多回复(44)

567

社区成员

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

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