请教大家在使用OPENMP并行化中遇到的问题问题

wert7588 2010-01-06 12:13:11
代码是fortran77写的,编译器用的是intel fortran 编译器,代码的组织结构是这样的
do i=1,n
do j=1,n
enddo
do k=1,n
enddo
do l=1,n
enddo
.
.
.
.
end do

代码的组织结构就是这样的,我用openmp并行化后运行top命令发现cpu只使用了188%
我的机器是i7-920,共有8个核
请问188%的 cpu使用率到底是用了1个核还是两个核?
还有,这段代码如何并行才能让cpu的8个核全部参与工作呢?
top命令截图
...全文
191 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wert7588 2010-01-06
  • 打赏
  • 举报
回复
我把最外层循环前面加上了
c$omp parallel
c$omp& shared(...很多变量)
c$omp& private(...很多变量)
c$omp do
.
.
.
$omp end do
$omp end parallel
top后发现cpu占用了188按理说如果占用了两个核那使用率应该是200%呀
如果我代码并行化的不对,希望明白的朋友可以告诉我一这段代码如何并行化才能让8个核一起工作
wert7588 2010-01-06
  • 打赏
  • 举报
回复
我把源程序也给贴上来,希望对openmp非常了解的朋友能帮我看看这段代码如何修改为并行的
do ii = 1, nion-1
i = iion(ii)
in = jion(ii)
ic = kion(ii)
xic = x(ic)
yic = y(ic)
zic = z(ic)
xi = x(i) - xic
yi = y(i) - yic
zi = z(i) - zic
fi = f * pchg(ii)
iuse = (use(i) .or. use(ic))
do j = 1, nion
cscale(iion(j)) = 1.0d0
end do
do j = 1, n12(in)
cscale(i12(j,in)) = c2scale
end do
do j = 1, n13(in)
cscale(i13(j,in)) = c3scale
end do
do j = 1, n14(in)
cscale(i14(j,in)) = c4scale
end do
do j = 1, n15(in)
cscale(i15(j,in)) = c5scale
end do

do kk = ii+1, nion
k = iion(kk)
kn = jion(kk)
kc = kion(kk)
proceed = .true.
if (use_group) call groups (proceed,fgrp,i,k,0,0,0,0)
if (proceed) proceed = (iuse .or. use(k) .or. use(kc))
if (proceed) then
xc = xic - x(kc)
yc = yic - y(kc)
zc = zic - z(kc)
if (use_image) call image (xc,yc,zc,0)
rc2 = xc*xc + yc*yc + zc*zc
if (rc2 .le. off2) then
xr = xc + xi - x(k) + x(kc)
yr = yc + yi - y(k) + y(kc)
zr = zc + zi - z(k) + z(kc)
r2 = xr*xr + yr*yr + zr*zr
r = sqrt(r2)
fik = fi * pchg(kk) * cscale(kn)
e = fik / r
de = -fik / r2
dc = 0.0d0
shift = fik / (0.5d0*(off+cut))
e = e - shift
if (rc2 .gt. cut2) then
rc = sqrt(rc2)
rc3 = rc2 * rc
rc4 = rc2 * rc2
rc5 = rc2 * rc3
rc6 = rc3 * rc3
rc7 = rc3 * rc4
taper = c5*rc5 + c4*rc4 + c3*rc3
& + c2*rc2 + c1*rc + c0
dtaper = 5.0d0*c5*rc4 + 4.0d0*c4*rc3
& + 3.0d0*c3*rc2 + 2.0d0*c2*rc + c1
trans = fik * (f7*rc7 + f6*rc6 + f5*rc5 + f4*rc4
& + f3*rc3 + f2*rc2 + f1*rc + f0)
dtrans = fik * (7.0d0*f7*rc6 + 6.0d0*f6*rc5
& + 5.0d0*f5*rc4 + 4.0d0*f4*rc3
& + 3.0d0*f3*rc2 + 2.0d0*f2*rc + f1)
dc = (e * dtaper + dtrans) / rc
de = de * taper
e = e * taper + trans
end if
if (use_group) then
e = e * fgrp
de = de * fgrp
dc = dc * fgrp
end if
de = de / r
dedx = de * xr
dedy = de * yr
dedz = de * zr
dedxc = dc * xc
dedyc = dc * yc
dedzc = dc * zc
ec = ec + e
dec(1,i) = dec(1,i) + dedx
dec(2,i) = dec(2,i) + dedy
dec(3,i) = dec(3,i) + dedz
dec(1,ic) = dec(1,ic) + dedxc
dec(2,ic) = dec(2,ic) + dedyc
dec(3,ic) = dec(3,ic) + dedzc
dec(1,k) = dec(1,k) - dedx
dec(2,k) = dec(2,k) - dedy
dec(3,k) = dec(3,k) - dedz
dec(1,kc) = dec(1,kc) - dedxc
dec(2,kc) = dec(2,kc) - dedyc
dec(3,kc) = dec(3,kc) - dedzc
vxx = xr*dedx + xc*dedxc
vyx = yr*dedx + yc*dedxc
vzx = zr*dedx + zc*dedxc
vyy = yr*dedy + yc*dedyc
vzy = zr*dedy + zc*dedyc
vzz = zr*dedz + zc*dedzc
vir(1,1) = vir(1,1) + vxx
vir(2,1) = vir(2,1) + vyx
vir(3,1) = vir(3,1) + vzx
vir(1,2) = vir(1,2) + vyx
vir(2,2) = vir(2,2) + vyy
vir(3,2) = vir(3,2) + vzy
vir(1,3) = vir(1,3) + vzx
vir(2,3) = vir(2,3) + vzy
vir(3,3) = vir(3,3) + vzz
if (molcule(i) .ne. molcule(k)) then
einter = einter + e
end if
end if
end if
end do
end do
wert7588 2010-01-06
  • 打赏
  • 举报
回复
csdn不能在帖子里发图片,我想把我top后的截图发给大家看看
wanglei5695312 2010-01-06
  • 打赏
  • 举报
回复
四重循环,并行起来中间变量确实挺复杂的,你这个程序是什么的啊?
wert7588 2010-01-06
  • 打赏
  • 举报
回复
我想到了一种解决方法,我把程序给拆分成为若干的子程序,然后减少shared和private中的变量数量,之后把最外层的循环给并行化
这么修改之后我发现程序可以调度起4个核来运行,cpu的运行可以达到380%左右
我想问一下,除了这种方式还有什么其他的方式吗?
wert7588 2010-01-06
  • 打赏
  • 举报
回复
我想到了一种解决方法,我把程序给拆分成为若干的子程序,然后减少shared和private中的变量数量,之后把最外层的循环给并行化
这么修改之后我发现程序可以调度起4个核来运行,cpu的运行可以达到380%左右
我想问一下,除了这种方式还有什么其他的方式吗?
wanglei5695312 2010-01-06
  • 打赏
  • 举报
回复
你的n值有多大啊?默认就应该是8个核同时工作了,cpu的使用率怎么会超过%100呢?

567

社区成员

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

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