f90_example.f90 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. ! StarPU --- Runtime system for heterogeneous multicore architectures.
  2. !
  3. ! Copyright (C) 2015-2020 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria
  4. ! Copyright (C) 2015 ONERA
  5. !
  6. ! StarPU is free software; you can redistribute it and/or modify
  7. ! it under the terms of the GNU Lesser General Public License as published by
  8. ! the Free Software Foundation; either version 2.1 of the License, or (at
  9. ! your option) any later version.
  10. !
  11. ! StarPU is distributed in the hope that it will be useful, but
  12. ! WITHOUT ANY WARRANTY; without even the implied warranty of
  13. ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  14. !
  15. ! See the GNU Lesser General Public License in COPYING.LGPL for more details.
  16. !
  17. ! This is an example of Fortran90 program making use of StarPU.
  18. ! It registers a few matrices for each element of a domain, performs
  19. ! update computations on them, and checks the result.
  20. PROGRAM f90_example
  21. USE mod_types
  22. USE starpu_mod
  23. USE mod_interface
  24. USE mod_compute
  25. USE iso_c_binding
  26. IMPLICIT NONE
  27. TYPE(type_mesh) :: mesh
  28. TYPE(type_numpar) :: numpar
  29. TYPE(type_mesh_elt),POINTER :: elt => NULL()
  30. INTEGER(KIND=C_INT) :: i,Nelt,res,cpus
  31. INTEGER(KIND=C_INT) :: starpu_maj,starpu_min,starpu_rev
  32. INTEGER(KIND=C_INT) :: neq,ng,nb,it,it_tot
  33. REAL(KIND=C_DOUBLE) :: r, coeff2
  34. !Initialization with arbitrary data
  35. Nelt = 2
  36. it_tot = 2
  37. numpar%Neq_max = 5
  38. numpar%coeff = 1.0
  39. ALLOCATE(mesh%elt(Nelt))
  40. DO i = 1,Nelt
  41. elt => mesh%elt(i)
  42. elt%Ng = 4
  43. elt%Np = 2
  44. ALLOCATE(elt%ro(numpar%Neq_max,elt%Np))
  45. ALLOCATE(elt%dro(numpar%Neq_max,elt%Np))
  46. ALLOCATE(elt%basis(elt%Np,elt%Ng))
  47. CALL init_element(elt%ro,elt%dro,elt%basis,numpar%Neq_max,elt%Np,elt%Ng,i)
  48. ENDDO
  49. !Initialization of StarPU
  50. res = starpu_my_init_c()
  51. IF (res == -19) THEN
  52. STOP 77
  53. END IF
  54. call starpu_get_version(starpu_maj,starpu_min,starpu_rev)
  55. WRITE(6,'(a,i4,a,i4,a,i4)') "StarPU version: ", starpu_maj , "." , starpu_min , "." , starpu_rev
  56. cpus = starpu_cpu_worker_get_count()
  57. IF (cpus == 0) THEN
  58. CALL starpu_shutdown()
  59. STOP 77
  60. END IF
  61. !Registration of elements
  62. DO i = 1,Nelt
  63. elt => mesh%elt(i)
  64. CALL starpu_register_element_c(numpar%Neq_max,elt%Np,elt%Ng,elt%ro,elt%dro, &
  65. elt%basis,elt%ro_h,elt%dro_h,elt%basis_h)
  66. ENDDO
  67. !Compute
  68. DO it = 1,it_tot
  69. ! compute new dro for each element
  70. DO i = 1,Nelt
  71. elt => mesh%elt(i)
  72. CALL starpu_loop_element_task_c(numpar%coeff,elt%ro_h,elt%dro_h,elt%basis_h)
  73. ENDDO
  74. ! sync (if needed by the algorithm)
  75. CALL starpu_task_wait_for_all()
  76. ! - - - - -
  77. ! copy dro to ro for each element
  78. DO i = 1,Nelt
  79. elt => mesh%elt(i)
  80. CALL starpu_copy_element_task_c(elt%ro_h,elt%dro_h)
  81. ENDDO
  82. ! sync (if needed by the algorithm)
  83. CALL starpu_task_wait_for_all()
  84. ENDDO
  85. !Unregistration of elements
  86. DO i = 1,Nelt
  87. elt => mesh%elt(i)
  88. CALL starpu_unregister_element_c(elt%ro_h,elt%dro_h,elt%basis_h)
  89. ENDDO
  90. !Terminate StarPU, no task can be submitted after
  91. CALL starpu_shutdown()
  92. !Check data with StarPU
  93. WRITE(6,'(a)') " "
  94. WRITE(6,'(a)') " %%%% RESULTS STARPU %%%% "
  95. WRITE(6,'(a)') " "
  96. DO i = 1,Nelt
  97. WRITE(6,'(a,i4,a)') " elt ", i , " ; elt%ro = "
  98. WRITE(6,'(10(1x,F11.2))') mesh%elt(i)%ro
  99. WRITE(6,'(a)') " ------------------------ "
  100. ENDDO
  101. !Same compute without StarPU
  102. DO i = 1,Nelt
  103. elt => mesh%elt(i)
  104. CALL init_element(elt%ro,elt%dro,elt%basis,numpar%Neq_max,elt%Np,elt%Ng,i)
  105. ENDDO
  106. DO it = 1, it_tot
  107. DO i = 1,Nelt
  108. elt => mesh%elt(i)
  109. CALL loop_element_cpu(elt%ro,elt%dro,elt%basis,numpar%coeff,numpar%Neq_max,elt%Ng,elt%Np)
  110. elt%ro = elt%ro + elt%dro
  111. ENDDO
  112. ENDDO
  113. WRITE(6,'(a)') " "
  114. WRITE(6,'(a)') " %%%% RESULTS VERIFICATION %%%% "
  115. WRITE(6,'(a)') " "
  116. DO i = 1,Nelt
  117. WRITE(6,'(a,i4,a)') " elt ", i , " ; elt%ro = "
  118. WRITE(6,'(10(1x,F11.2))') mesh%elt(i)%ro
  119. WRITE(6,'(a)') " ------------------------ "
  120. ENDDO
  121. WRITE(6,'(a)') " "
  122. !Deallocation
  123. DO i = 1,Nelt
  124. elt => mesh%elt(i)
  125. DEALLOCATE(elt%ro)
  126. DEALLOCATE(elt%dro)
  127. DEALLOCATE(elt%basis)
  128. ENDDO
  129. DEALLOCATE(mesh%elt)
  130. END PROGRAM f90_example