Advertisement
Guest User

Untitled

a guest
Jul 3rd, 2019
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. program lincombtest
  2.     use iso_fortran_env, only: int64
  3.     implicit none
  4.  
  5.     integer, parameter :: n = 100
  6.  
  7.     real :: f
  8.     real :: var(10*n,10*n,n,2), res(10*n,10*n,n)
  9.  
  10.     integer(int64) :: t0, t1, rate
  11.     integer :: ntot = size(res)
  12.  
  13.     call random_number(f)
  14.     call random_number(var)
  15.  
  16.     ! Naive approach
  17.     call system_clock(t0, rate)
  18.     res = f*var(:,:,:,1) + (1-f)*var(:,:,:,2)
  19.     call system_clock(t1, rate)
  20.  
  21.     write(*,"(a,f0.4)") "Simple expression: t1 - t0 = ", (t1 - t0)/(1.0d0*rate)
  22.  
  23.     ! (Open)BLAS
  24.     call system_clock(t0, rate)
  25.     call sscal(ntot, f, var(:,:,:,1), 1)
  26.     call saxpy(ntot, 1-f, var(:,:,:,2), 1, var(:,:,:,1), 1)
  27.     call system_clock(t1, rate)
  28.  
  29.     write(*,"(a,f0.4)") "BLAS: t1 - t0 = ", (t1 - t0)/(1.0d0*rate)
  30.     write(*,"(a,x,f0.6,x,f0.6)") "Comparing results:", var(1,1,1,1), res(1,1,1)
  31.  
  32. end program
  33.  
  34. ! gfortran -Ofast -march=native blah.f90 -lblas && ./a.out
  35. ! Simple expression: t1 - t0 = .1500
  36. ! BLAS: t1 - t0 = .0398
  37. ! Comparing results: .477540 .477540
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement