【问题标题】:A little help regarding openMP and gomp关于 openMP 和 gomp 的一点帮助
【发布时间】:2011-10-20 17:51:02
【问题描述】:

这是本书中实现的矩阵到向量乘法的并行(逐字)版本

using OpenMP

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

我收到此语法错误“未分类的 openMP 子句共享”、“未分类的 openMP 子句私有” 使用 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 的新手(但我需要快速学习它......我工作的一部分!) 一些解释在这里将不胜感激.. 有没有只使用 gomp 的 openMP 教程(比如 gcc/gfortran 4.4.5)?

【问题讨论】:

    标签: openmp gfortran


    【解决方案1】:

    这与 gcc 的 OpenMP 实现无关; intel fortran 也拒绝编译它。这只是关于如何在 OpenMP + Fortran 中继续行。

    你想做的,完全正确的是:

    !$omp parallel do default(none) shared(mat,vec,res,m,n) private(i,j)
    

    我衷心赞同使用默认无并明确指定共享和私有变量作为最佳实践的方法。如果您使用上面的行,您的例程将编译

    为清楚起见,代码将其分成多行;这并没有什么问题,除了语法是,与其他现代 Fortran 续行一样,您需要在续行末尾添加一个 & 符号:

     !$omp parallel do default(none)  &
     !$omp shared(mat,vec,res,m,n) private(i,j)
    

    这大概是书中的一个错字。因为 OpenMP 是一种标准,所以 OpenMP 没有特殊的 gomp(或 iomp)版本。兼容的 OpenMP 程序应该在任何兼容的编译器上编译。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-22
      • 2011-08-25
      相关资源
      最近更新 更多