Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- module thrust
- interface thrustmin
- function min_integer(input,N) bind(C,name="min_int_wrapper")
- use iso_c_binding
- integer(c_int),device:: input(*)
- integer(c_int),value:: N, min_integer
- end function
- function min_float(input,N) bind(C,name="min_float_wrapper")
- use iso_c_binding
- real(c_float),device:: input(*)
- integer(c_int),value:: N, min_float
- end function
- function min_double(input,N) bind(C,name="min_double_wrapper")
- use iso_c_binding
- real(c_double),device:: input(*)
- integer(c_int),value:: N, min_double
- end function
- end interface
- interface thrustmax
- function max_integer(input,N) bind(C,name="max_int_wrapper")
- use iso_c_binding
- integer(c_int),device:: input(*)
- integer(c_int),value:: N, max_integer
- end function
- function max_float(input,N) bind(C,name="max_float_wrapper")
- use iso_c_binding
- real(c_float),device:: input(*)
- integer(c_int),value:: N, max_float
- end function
- function max_double(input,N) bind(C,name="max_double_wrapper")
- use iso_c_binding
- real(c_double),device:: input(*)
- integer(c_int),value:: N, max_double
- end function
- end interface
- interface thrustsort
- subroutine sort_integer(input,N) bind(C,name="sort_int_wrapper")
- use iso_c_binding
- integer(c_int),device:: input(*)
- integer(c_int),value:: N
- end subroutine
- subroutine sort_float(input,N) bind(C,name="sort_float_wrapper")
- use iso_c_binding
- real(c_float),device:: input(*)
- integer(c_int),value:: N
- end subroutine
- subroutine sort_double(input,N) bind(C,name="sort_double_wrapper")
- use iso_c_binding
- real(c_double),device:: input(*)
- integer(c_int),value:: N
- end subroutine
- end interface
- interface thrustsum
- function reduce_integer(input,N) bind(C,name="reduce_int_wrapper")
- use iso_c_binding
- integer(c_int),device:: input(*)
- integer(c_int) :: reduce_integer
- integer(c_int),value:: N
- end function
- function reduce_float(input,N) bind(C,name="reduce_float_wrapper")
- use iso_c_binding
- real(c_float),device:: input(*)
- real(c_float) :: reduce_float
- integer(c_int),value:: N
- end function
- function reduce_double(input,N) bind(C,name="reduce_double_wrapper")
- use iso_c_binding
- real(c_double),device:: input(*)
- real(c_double) :: reduce_double
- integer(c_int),value:: N
- end function
- end interface
- end module thrust
- program GPU
- use cudafor
- use thrust
- implicit none
- real, allocatable, device :: dev_array(:)
- real, allocatable :: host_array(:)
- real :: varsum
- integer N / 1024 /
- integer :: x
- allocate(dev_array(N))
- allocate(host_array(N))
- call random_seed
- call random_number(host_array)
- print *, "COPY!"
- host_array = host_array * 10.0
- dev_array = host_array
- print *, "host_array:"
- print *, host_array
- print *, "elements:", N
- !call thrustsort(dev_array, size(dev_array))
- print *, "START CUDA! min:"
- x = thrustmin(dev_array, size(dev_array))
- print *, "Min:", x
- x = thrustmax(dev_array, size(dev_array))
- print *, "Max:", x
- varsum = thrustsum(dev_array, size(dev_array))
- print *, "Sum:", varsum
- print *, "DONE CUDA!"
- deallocate(dev_array)
- deallocate(host_array)
- end program GPU
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement