! ! 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 |