Высокопроизводительные вычисления на кластерах. Беликов Д.А - 119 стр.

UptoLike

119
! отключение выбора количества нитей по умолчанию
!$ call omp_set_dynamic(.false.) ! if .false. you can change count of
threads
!
! задание числа используемых нитей
!$ call omp_set_num_threads(4) ! count of threads = 4
!
! вывод на экран количества используемых нитей
!$omp parallel
!$ write(*,*) 'openmp-parallel with', omp_get_num_threads()
!$omp end parallel
!
! вызов подпрограммы генерации матрицы
call matgen(a, m_size)
!
! расчет начального приближения
do i=1, m_size
x(i)=a(i,m_size+1)/a(i,i)
if (x(i).gt.max_err) max_err=dabs(x(i))
end do
!
drmax=0.0
! счетчик итераций
count1 = 1
! основной вычислительный цикл программы
do while (max_err.gt.eps.or.drmax.gt.eps)
max_err=0d0
drmax=0d0
!$omp parallel
!$omp do private (summ) reduction(max:max_err)
do i=1, m_size
summ=0
do j=1, i-1
summ=summ+a(i,j)*x(j)
end do
do j=i+1, m_size
summ=summ+a(i,j)*x(j)
end do
xx(i) = (a(i,m_size+1)-summ)/a(i,i)