Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы программирования на FORTRAN (ФОРТРАН)

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
На первую страницук этому сообщениюк последнему сообщению

Открыть новую тему     Написать ответ в эту тему

akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору


Код:

!
! Parallel compilation:
!
!   /Qopenmp /Qfpp  
!
! Serial compilation:
!
!   Use the same command, but omit the -openmp (Linux and Mac OS X)
!   or /Qopenmp (Windows) option.
 
 
program ompPrime
 
#ifdef _OPENMP  
   include 'omp_lib.h'  !needed for OMP_GET_NUM_THREADS()
#endif
 
integer :: start = 1
integer :: end = 10000000
integer :: number_of_primes = 0
integer :: number_of_41primes = 0
integer :: number_of_43primes = 0
integer index, factor, limit, nthr
real rindex, rlimit
logical prime, print_primes
 
!as
  real :: tstart, tend, tstart
 
print_primes = .false.
nthr = 1 ! assume just one thread
print *, ' Range to check for Primes:',start,end
 
  call cpu_time(tstart)
 
#ifdef _OPENMP
!$omp parallel  
 
!$omp single
   nthr = OMP_GET_NUM_THREADS()
   print *, ' We are using',nthr,' thread(s)'
!$omp end single
!
 
!
!$omp do private(factor, limit, prime) &
   schedule(dynamic,10) &
   reduction(+:number_of_primes,number_of_41primes,number_of_43primes)
#else
   print *, ' We are using',nthr,' thread(s)'
#endif
 
do index = start, end, 2   !workshared loop
 
   limit = int(sqrt(real(index)))
   prime = .true.  ! assume number is prime
   factor = 3
 
   do
      if(prime .and. factor .le. limit) then
         if(mod(index,factor) .eq. 0) then
            prime = .false.
         endif
         factor = factor + 2
      else
         exit  ! we can jump out of non-workshared loop
      endif
   enddo
 
   if(prime) then
      if(print_primes) then
         print *, index, ' is prime'
      endif
 
      number_of_primes = number_of_primes + 1
 
      if(mod(index,4) .eq. 1) then
         number_of_41primes = number_of_41primes + 1
      endif
 
      if(mod(index,4) .eq. 3) then
         number_of_43primes = number_of_43primes + 1
      endif
 
   endif   ! if(prime)
enddo
!$omp end do
!$omp end parallel
 
 
print *, ' Number of primes found:',number_of_primes  
print *, ' Number of 4n+1 primes found:',number_of_41primes
print *, ' Number of 4n-1 primes found:',number_of_43primes
 
 
!as  
  call cpu_time(tend)  
  telapsed = tend - tstart
  write(*,*)
  print*, " elapsed time = ", telapsed
 
 
end program ompPrime


Всего записей: 24114 | Зарегистр. 06-12-2002 | Отправлено: 21:42 04-06-2018 | Исправлено: akaGM, 22:06 04-06-2018
Открыть новую тему     Написать ответ в эту тему

На первую страницук этому сообщениюк последнему сообщению

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы программирования на FORTRAN (ФОРТРАН)


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru