Небольшая помощь относительно openMP и gomp - PullRequest
0 голосов
/ 05 августа 2011

здесь - параллельная (дословная) версия умножения матрицы на вектор, реализованная в этой книге

с использованием 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 (но мне нужно быстро это освоить ... часть моей работы!) Некоторое объяснение здесь будет оценено. есть ли учебник openMP только с использованием gomp (скажем, gcc / gfortran 4.4.5)?

1 Ответ

1 голос
/ 05 августа 2011

Это не имеет никакого отношения к реализации OpenMP в gcc; Intel Fortran отказывается компилировать это тоже. Это как раз то, как строки продолжаются в OpenMP + Fortran.

То, что вы хотите сделать, что совершенно правильно, это:

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

Я от всей души одобряю подход использования по умолчанию none и явное указание общих и закрытых переменных в качестве наилучшей практики. Если вы используете строку выше, ваша программа скомпилирует

Код разбит это на несколько строк, для ясности; и в этом нет ничего плохого, за исключением того, что синтаксис, как и в других современных продолжениях Фортрана, вам нужен амперсанд в конце продолжения:

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

Предположительно, это была опечатка в книге. Поскольку OpenMP является стандартом, не существует специальной версии OpenMP для gomp (или iomp). Совместимая программа OpenMP должна компилироваться на любом совместимом компиляторе.

...