这是本书中实现的向量乘法的矩阵的并行(逐字)版本
subroutine matvecmul(mat,vec,res,m,n)
use omp_lib
implicit none
integer::m,n,i,j
real*8,dimension(m,n),intent(in)::mat
real*8,dimension(n),intent(in)::vec
real*8,dimension(m)::res
res(:)=0.0
!$omp parallel do default(none)
!$omp shared(mat,vec,res,m,n) private(i,j)
do i=1,m
do j=1,n
res(i)=res(i)+mat(i,j)*vec(j)
end do
end do
!$omp end parallel do
return
end subroutine matvecmul
我得到这个语法错误“unlassified openMP clause shared”,“unlassified openMP clause private” 用gfortran 4.4.5和gfortran 4.6.0编译
是在“gomp”中删除/删除或未实现的共享子句,或者我犯了一些愚蠢的错误或书的勘误...... 默认情况下(一)我没有得到任何语法错误我应该怎么说哪些变量是私有的,哪些是共享的?
这是我如何实现没有错误(和正确)
subroutine matvecmul(mat,vec,res,m,n)
use omp_lib
implicit none
integer::m,n,i,j
real*8,dimension(m,n),intent(in)::mat
real*8,dimension(n),intent(in)::vec
real*8,dimension(m)::res
res(:)=0.0
!$omp parallel do private(i,j)
do i=1,m
do j=1,n
res(i)=res(i)+mat(i,j)*vec(j)
end do
end do
!$omp end parallel do
return
end subroutine matvecmul
我仍然是openmp的新手(但我需要快速学习......我的工作的一部分!) 一些解释在这里将不胜感激.. 是否有任何openMP教程只使用gomp(比如说gcc / gfortran 4.4.5)?
答案 0 :(得分:1)
这与gcc的OpenMP实现没有任何关系; intel fortran也拒绝编译。这只是关于如何在OpenMP + Fortran中继续行。
您想要做的,完全正确的是:
!$omp parallel do default(none) shared(mat,vec,res,m,n) private(i,j)
我衷心赞同使用default none的方法,并明确指定共享和私有变量作为最佳实践。如果您使用上面的行,您的例程将编译
为清晰起见,代码将其分为多行;并且没有任何问题,除了语法是这样的,就像其他现代Fortran延续线一样,你需要在续行的末尾加上&符号:
!$omp parallel do default(none) &
!$omp shared(mat,vec,res,m,n) private(i,j)
据推测,这是书中的一个错字。由于OpenMP是标准,因此没有特殊的OpenMP(或iomp)版本的OpenMP。兼容的OpenMP程序应该在任何兼容的编译器上编译。