fstarpu_mod.f90 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. ! StarPU --- Runtime system for heterogeneous multicore architectures.
  2. !
  3. ! Copyright (C) 2016 Inria
  4. !
  5. ! StarPU is free software; you can redistribute it and/or modify
  6. ! it under the terms of the GNU Lesser General Public License as published by
  7. ! the Free Software Foundation; either version 2.1 of the License, or (at
  8. ! your option) any later version.
  9. !
  10. ! StarPU is distributed in the hope that it will be useful, but
  11. ! WITHOUT ANY WARRANTY; without even the implied warranty of
  12. ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  13. !
  14. ! See the GNU Lesser General Public License in COPYING.LGPL for more details.
  15. module fstarpu_mod
  16. use iso_c_binding
  17. integer(c_int), bind(C) :: FSTARPU_R
  18. integer(c_int), bind(C) :: FSTARPU_W
  19. integer(c_int), bind(C) :: FSTARPU_RW
  20. integer(c_int), bind(C) :: FSTARPU_SCRATCH
  21. integer(c_int), bind(C) :: FSTARPU_REDUX
  22. type(c_ptr), bind(C) :: FSTARPU_DATA
  23. type(c_ptr), bind(C) :: FSTARPU_VALUE
  24. type(c_ptr), bind(C) :: FSTARPU_SZ_INT4
  25. type(c_ptr), bind(C) :: FSTARPU_SZ_INT8
  26. type(c_ptr), bind(C) :: FSTARPU_SZ_REAL4
  27. type(c_ptr), bind(C) :: FSTARPU_SZ_REAL8
  28. interface
  29. ! == starpu.h ==
  30. subroutine fstarpu_conf_init(conf) bind(C,name="starpu_conf_init")
  31. use iso_c_binding, only: c_ptr
  32. type(c_ptr), value, intent(in) :: conf
  33. end subroutine fstarpu_conf_init
  34. ! starpu_init: see fstarpu_init
  35. ! starpu_initialize: see fstarpu_init
  36. subroutine fstarpu_pause() bind(C,name="starpu_pause")
  37. end subroutine fstarpu_pause
  38. subroutine fstarpu_resume() bind(C,name="starpu_resume")
  39. end subroutine fstarpu_resume
  40. subroutine fstarpu_shutdown () bind(C,name="starpu_shutdown")
  41. end subroutine fstarpu_shutdown
  42. ! starpu_topology_print
  43. subroutine fstarpu_asynchronous_copy_disabled() bind(C,name="starpu_asynchronous_copy_disabled")
  44. end subroutine fstarpu_asynchronous_copy_disabled
  45. subroutine fstarpu_asynchronous_cuda_copy_disabled() bind(C,name="starpu_asynchronous_cuda_copy_disabled")
  46. end subroutine fstarpu_asynchronous_cuda_copy_disabled
  47. subroutine fstarpu_asynchronous_opencl_copy_disabled() bind(C,name="starpu_asynchronous_opencl_copy_disabled")
  48. end subroutine fstarpu_asynchronous_opencl_copy_disabled
  49. subroutine fstarpu_asynchronous_mic_copy_disabled() bind(C,name="starpu_asynchronous_mic_copy_disabled")
  50. end subroutine fstarpu_asynchronous_mic_copy_disabled
  51. subroutine fstarpu_display_stats() bind(C,name="starpu_display_stats")
  52. end subroutine fstarpu_display_stats
  53. subroutine fstarpu_get_version(major,minor,release) bind(C,name="starpu_get_version")
  54. use iso_c_binding, only: c_int
  55. integer(c_int), intent(out) :: major,minor,release
  56. end subroutine fstarpu_get_version
  57. function fstarpu_cpu_worker_get_count() bind(C,name="starpu_cpu_worker_get_count")
  58. use iso_c_binding, only: c_int
  59. integer(c_int) :: fstarpu_cpu_worker_get_count
  60. end function fstarpu_cpu_worker_get_count
  61. ! == starpu_task.h ==
  62. ! starpu_tag_declare_deps
  63. ! starpu_tag_declare_deps_array
  64. ! starpu_task_declare_deps_array
  65. ! starpu_tag_wait
  66. ! starpu_tag_wait_array
  67. ! starpu_tag_notify_from_apps
  68. ! starpu_tag_restart
  69. ! starpu_tag_remove
  70. ! starpu_task_init
  71. ! starpu_task_clean
  72. ! starpu_task_create
  73. ! starpu_task_destroy
  74. ! starpu_task_submit
  75. ! starpu_task_submit_to_ctx
  76. ! starpu_task_finished
  77. ! starpu_task_wait
  78. subroutine fstarpu_task_wait_for_all () bind(C,name="starpu_task_wait_for_all")
  79. end subroutine fstarpu_task_wait_for_all
  80. ! starpu_task_wait_for_n_submitted
  81. ! starpu_task_wait_for_all_in_ctx
  82. ! starpu_task_wait_for_n_submitted_in_ctx
  83. ! starpu_task_wait_for_no_ready
  84. ! starpu_task_nready
  85. ! starpu_task_nsubmitted
  86. ! starpu_codelet_init
  87. ! starpu_codelet_display_stats
  88. ! starpu_task_get_current
  89. ! starpu_parallel_task_barrier_init
  90. ! starpu_parallel_task_barrier_init_n
  91. ! starpu_task_dup
  92. ! starpu_task_set_implementation
  93. ! starpu_task_get_implementation
  94. ! --
  95. function fstarpu_codelet_allocate () bind(C)
  96. use iso_c_binding, only: c_ptr
  97. type(c_ptr) :: fstarpu_codelet_allocate
  98. end function fstarpu_codelet_allocate
  99. subroutine fstarpu_codelet_free (cl) bind(C)
  100. use iso_c_binding, only: c_ptr
  101. type(c_ptr), value, intent(in) :: cl
  102. end subroutine fstarpu_codelet_free
  103. subroutine fstarpu_codelet_add_cpu_func (cl, f_ptr) bind(C)
  104. use iso_c_binding, only: c_ptr, c_funptr
  105. type(c_ptr), value, intent(in) :: cl
  106. type(c_funptr), value, intent(in) :: f_ptr
  107. end subroutine fstarpu_codelet_add_cpu_func
  108. subroutine fstarpu_codelet_add_cuda_func (cl, f_ptr) bind(C)
  109. use iso_c_binding, only: c_ptr, c_funptr
  110. type(c_ptr), value, intent(in) :: cl
  111. type(c_funptr), value, intent(in) :: f_ptr
  112. end subroutine fstarpu_codelet_add_cuda_func
  113. subroutine fstarpu_codelet_add_opencl_func (cl, f_ptr) bind(C)
  114. use iso_c_binding, only: c_ptr, c_funptr
  115. type(c_ptr), value, intent(in) :: cl
  116. type(c_funptr), value, intent(in) :: f_ptr
  117. end subroutine fstarpu_codelet_add_opencl_func
  118. subroutine fstarpu_codelet_add_buffer (cl, mode) bind(C)
  119. use iso_c_binding, only: c_ptr, c_int
  120. type(c_ptr), value, intent(in) :: cl
  121. integer(c_int), value, intent(in) :: mode
  122. end subroutine fstarpu_codelet_add_buffer
  123. function fstarpu_vector_data_register(vector, nx, elt_size, ram) bind(C)
  124. use iso_c_binding, only: c_ptr, c_int, c_size_t
  125. type(c_ptr) :: fstarpu_vector_data_register
  126. type(c_ptr), value, intent(in) :: vector
  127. integer(c_int), value, intent(in) :: nx
  128. integer(c_size_t), value, intent(in) :: elt_size
  129. integer(c_int), value, intent(in) :: ram
  130. end function fstarpu_vector_data_register
  131. function fstarpu_vector_get_ptr(buffers, i) bind(C)
  132. use iso_c_binding, only: c_ptr, c_int
  133. type(c_ptr) :: fstarpu_vector_get_ptr
  134. type(c_ptr), value, intent(in) :: buffers
  135. integer(c_int), value, intent(in) :: i
  136. end function fstarpu_vector_get_ptr
  137. function fstarpu_vector_get_nx(buffers, i) bind(C)
  138. use iso_c_binding, only: c_ptr, c_int
  139. integer(c_int) :: fstarpu_vector_get_nx
  140. type(c_ptr), value, intent(in) :: buffers
  141. integer(c_int), value, intent(in) :: i
  142. end function fstarpu_vector_get_nx
  143. function fstarpu_matrix_data_register(matrix, ldy, ny, nx, elt_size, ram) bind(C)
  144. use iso_c_binding, only: c_ptr, c_int, c_size_t
  145. type(c_ptr) :: fstarpu_matrix_data_register
  146. type(c_ptr), value, intent(in) :: matrix
  147. integer(c_int), value, intent(in) :: ldy
  148. integer(c_int), value, intent(in) :: ny
  149. integer(c_int), value, intent(in) :: nx
  150. integer(c_size_t), value, intent(in) :: elt_size
  151. integer(c_int), value, intent(in) :: ram
  152. end function fstarpu_matrix_data_register
  153. function fstarpu_matrix_get_ptr(buffers, i) bind(C)
  154. use iso_c_binding, only: c_ptr, c_int
  155. type(c_ptr) :: fstarpu_matrix_get_ptr
  156. type(c_ptr), value, intent(in) :: buffers
  157. integer(c_int), value, intent(in) :: i
  158. end function fstarpu_matrix_get_ptr
  159. function fstarpu_matrix_get_ld(buffers, i) bind(C)
  160. use iso_c_binding, only: c_ptr, c_int
  161. integer(c_int) :: fstarpu_matrix_get_ld
  162. type(c_ptr), value, intent(in) :: buffers
  163. integer(c_int), value, intent(in) :: i
  164. end function fstarpu_matrix_get_ld
  165. function fstarpu_matrix_get_ny(buffers, i) bind(C)
  166. use iso_c_binding, only: c_ptr, c_int
  167. integer(c_int) :: fstarpu_matrix_get_ny
  168. type(c_ptr), value, intent(in) :: buffers
  169. integer(c_int), value, intent(in) :: i
  170. end function fstarpu_matrix_get_ny
  171. function fstarpu_matrix_get_nx(buffers, i) bind(C)
  172. use iso_c_binding, only: c_ptr, c_int
  173. integer(c_int) :: fstarpu_matrix_get_nx
  174. type(c_ptr), value, intent(in) :: buffers
  175. integer(c_int), value, intent(in) :: i
  176. end function fstarpu_matrix_get_nx
  177. subroutine fstarpu_data_unregister (dh) bind(C,name="starpu_data_unregister")
  178. use iso_c_binding, only: c_ptr
  179. type(c_ptr), value, intent(in) :: dh
  180. end subroutine fstarpu_data_unregister
  181. subroutine fstarpu_insert_task(arglist) bind(C)
  182. use iso_c_binding, only: c_ptr
  183. type(c_ptr), dimension(:), intent(in) :: arglist
  184. end subroutine fstarpu_insert_task
  185. subroutine fstarpu_unpack_arg(cl_arg,bufferlist) bind(C)
  186. use iso_c_binding, only: c_ptr
  187. type(c_ptr), value, intent(in) :: cl_arg
  188. type(c_ptr), dimension(:), intent(in) :: bufferlist
  189. end subroutine fstarpu_unpack_arg
  190. end interface
  191. contains
  192. function fstarpu_init (conf) bind(C)
  193. use iso_c_binding
  194. integer(c_int) :: fstarpu_init
  195. type(c_ptr), value, intent(in) :: conf
  196. integer(4) :: FSTARPU_SZ_INT4_dummy
  197. integer(8) :: FSTARPU_SZ_INT8_dummy
  198. real(4) :: FSTARPU_SZ_REAL4_dummy
  199. real(8) :: FSTARPU_SZ_REAL8_dummy
  200. ! Note: Referencing global C constants from Fortran has
  201. ! been found unreliable on some architectures, notably
  202. ! on Darwin. The get_integer/get_pointer_constant
  203. ! scheme is a workaround to that issue.
  204. interface
  205. ! These functions are not exported to the end user
  206. function fstarpu_get_integer_constant(s) bind(C)
  207. use iso_c_binding, only: c_int,c_char
  208. integer(c_int) :: fstarpu_get_integer_constant
  209. character(kind=c_char) :: s
  210. end function fstarpu_get_integer_constant
  211. function fstarpu_get_pointer_constant(s) bind(C)
  212. use iso_c_binding, only: c_ptr,c_char
  213. type(c_ptr) :: fstarpu_get_pointer_constant
  214. character(kind=c_char) :: s
  215. end function fstarpu_get_pointer_constant
  216. function fstarpu_init_internal (conf) bind(C,name="starpu_init")
  217. use iso_c_binding, only: c_ptr,c_int
  218. integer(c_int) :: fstarpu_init_internal
  219. type(c_ptr), value :: conf
  220. end function fstarpu_init_internal
  221. end interface
  222. ! Initialize Fortran integer constants from C peers
  223. FSTARPU_R = fstarpu_get_integer_constant(C_CHAR_"FSTARPU_R"//C_NULL_CHAR)
  224. FSTARPU_W = fstarpu_get_integer_constant(C_CHAR_"FSTARPU_W"//C_NULL_CHAR)
  225. FSTARPU_RW = fstarpu_get_integer_constant(C_CHAR_"FSTARPU_RW"//C_NULL_CHAR)
  226. FSTARPU_SCRATCH = fstarpu_get_integer_constant(C_CHAR_"FSTARPU_SCRATCH"//C_NULL_CHAR)
  227. FSTARPU_REDUX = fstarpu_get_integer_constant(C_CHAR_"FSTARPU_REDUX"//C_NULL_CHAR)
  228. ! Initialize Fortran 'pointer' constants from C peers
  229. FSTARPU_DATA = fstarpu_get_pointer_constant(C_CHAR_"FSTARPU_DATA"//C_NULL_CHAR)
  230. FSTARPU_VALUE = fstarpu_get_pointer_constant(C_CHAR_"FSTARPU_VALUE"//C_NULL_CHAR)
  231. ! Initialize size constants as 'c_ptr'
  232. FSTARPU_SZ_INT4 = transfer(int(c_sizeof(FSTARPU_SZ_INT4_dummy),kind=c_intptr_t),C_NULL_PTR)
  233. FSTARPU_SZ_INT8 = transfer(int(c_sizeof(FSTARPU_SZ_INT8_dummy),kind=c_intptr_t),C_NULL_PTR)
  234. FSTARPU_SZ_REAL4 = transfer(int(c_sizeof(FSTARPU_SZ_REAL4_dummy),kind=c_intptr_t),C_NULL_PTR)
  235. FSTARPU_SZ_REAL8 = transfer(int(c_sizeof(FSTARPU_SZ_REAL8_dummy),kind=c_intptr_t),C_NULL_PTR)
  236. ! Initialize StarPU
  237. if (c_associated(conf)) then
  238. fstarpu_init = fstarpu_init_internal(conf)
  239. else
  240. fstarpu_init = fstarpu_init_internal(C_NULL_PTR)
  241. end if
  242. end function fstarpu_init
  243. function fstarpu_csizet_to_cptr(i) bind(C)
  244. use iso_c_binding
  245. type(c_ptr) :: fstarpu_csizet_to_cptr
  246. integer(c_size_t) :: i
  247. fstarpu_csizet_to_cptr = transfer(int(i,kind=c_intptr_t),C_NULL_PTR)
  248. end function fstarpu_csizet_to_cptr
  249. function fstarpu_int_to_cptr(i) bind(C)
  250. use iso_c_binding
  251. type(c_ptr) :: fstarpu_int_to_cptr
  252. integer :: i
  253. fstarpu_int_to_cptr = transfer(int(i,kind=c_intptr_t),C_NULL_PTR)
  254. end function fstarpu_int_to_cptr
  255. end module fstarpu_mod