主题:请教IMSL里的函数如何用OpenMP进行并行处理?
saupt005
[专家分:0] 发布于 2012-02-25 11:11:00
各位老师:
我最近在用OpenMP进行并行数学运算,矩阵填充部分我很好地利用并行实现了,但是发现不能运用!$OMP Parallel语句对IMSL的求解函数进行并行处理,而计算一个方程组的绝大多数时间是花在了求解上面,仅仅将矩阵填充的过程并行化是没有意义的。我想问一下,如何对IMSL内部的函数如lin_sol_gen进行并行处理呢?
回复列表 (共7个回复)
沙发
saupt005 [专家分:0] 发布于 2012-02-25 21:30:00
include "link_fnl_shared.h"
program OMP
use lin_sol_gen_int
use rand_gen_int
use error_option_packet
implicit none
integer i,j,k,m,o,p
integer,parameter :: n=50
integer,parameter :: X=n*n
real,parameter :: a=0.5
real,parameter :: V=1.0
real,allocatable :: l(:,:),aa(:,:),bb(:,:)
real :: b=a/real(n)
real :: C=0.0
integer :: time(0:1),timediff
allocate( l(X,X),aa(X,1),bb(X,1))
bb=V
call system_clock(time(0))
!$OMP Parallel
!$OMP do
do i=1,X
do j=1,X
m=i/n
p=j/n
k=mod(i,n)
o=mod(j,n)
if(k==0) then
k=n
m=m-1
end if
if(o==0) then
o=n
p=p-1
end if
if(i==j) then
l(j,i)=2*b*0.8814*3.6
else
l(j,i)=1.8*b/sqrt(((float(k-o))**2+(float(m-p))**2))
end if
end do
end do
!$OMP end do
!$OMP end Parallel
call system_clock(time(1))
timediff=time(1)-time(0)
write(*,*) timediff
call system_clock(time(0))
!$OMP parallel shared(l,aa)
call lin_sol_gen(l,bb,aa)
!$OMP end parallel
call system_clock(time(1))
!$OMP Parallel
!$OMP do REDUCTION(+:c)
do i=1,X
C=aa(i,1)+C
end do
!$OMP end do
!$OMP end Parallel
deallocate(l,aa,bb)
C=C*4*b*b*100/V
write(*,*) C
timediff=time(1)-time(0)
write(*,*) timediff
pause
end
板凳
yeg001 [专家分:14390] 发布于 2012-02-26 10:19:00
!$OMP parallel shared(l,aa)
call lin_sol_gen(l,bb,aa)
!$OMP end parallel
这样确实是没意义的. 这个并行效果只是让各个线程都执行这个语句而不是协同执行这个求解过程. 而且aa(我猜是存储结果的矩阵)会因为多线程而数据竞争,最终可能反而计算时间更长.
楼主要多线程协同计算矩阵就要找本身支持多线程的库, 我不知道IMSL里面那些函数和有什么开关能够运行并行库, 需要你自己找找.
另一方面,线性方程求解还是用到lapack库的东西, 其实优化过的MKL(AMCL应该也有)是有并行库调用的.有兴趣去intel官网查查MKL文档.
3 楼
saupt005 [专家分:0] 发布于 2012-02-26 17:56:00
非常感谢!另外请您能详细说一说例如什么库可以支持OpenMP的运算吗?
4 楼
yeg001 [专家分:14390] 发布于 2012-02-26 20:05:00
库本身能并行跟支持并行是不同的意思, 我看你的代码意思觉得你是想实现前者.
支持用并行的话,只需要库是"线程安全"(thread safe)就可以. 用某个库的时候最好先看看说明文档. 一般一直在维护的库基本是线程安全的. 连lapack由3.2版本起就线程安全了.
5 楼
saupt005 [专家分:0] 发布于 2012-02-26 23:48:00
我确实是想实现前者。以您的经验,您能给我推荐一个能够并行的支持OpenMP的数学库吗?
6 楼
yeg001 [专家分:14390] 发布于 2012-02-27 13:54:00
你调用的是线性库. 其实IMSL,MKL,ACML等这些都是基于lapack库做优化的而已.
我明确知道的是MKL本身有支持并行求解的部分. 但IMSL我觉得也应该支持的,毕竟是收费的库,服务应该更多才对.
7 楼
saupt005 [专家分:0] 发布于 2012-02-27 17:07:00
OK,谢谢您!我会找一找您所提到的这些库,如果以后我还有不明白的地方,还忘您能不吝赐教!
我来回复