starpu_codelet.jl 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. export StarpuDataAccessMode
  2. export STARPU_NONE,STARPU_R,STARPU_W,STARPU_RW, STARPU_SCRATCH
  3. export STARPU_REDUX,STARPU_COMMUTE, STARPU_SSEND, STARPU_LOCALITY
  4. export STARPU_ACCESS_MODE_MAX
  5. @enum(StarpuDataAccessMode,
  6. STARPU_NONE = 0,
  7. STARPU_R = (1 << 0),
  8. STARPU_W = (1 << 1),
  9. STARPU_RW = ((1 << 0) | (1 << 1)),
  10. STARPU_SCRATCH = (1 << 2),
  11. STARPU_REDUX = (1 << 3),
  12. STARPU_COMMUTE = (1 << 4),
  13. STARPU_SSEND = (1 << 5),
  14. STARPU_LOCALITY = (1 << 6),
  15. STARPU_ACCESS_MODE_MAX = (1 << 7)
  16. )
  17. export StarpuCodelet
  18. struct StarpuCodelet
  19. where_to_execute :: UInt32
  20. cpu_func :: String
  21. gpu_func :: String
  22. modes :: Vector{StarpuDataAccessMode}
  23. perfmodel :: StarpuPerfmodel
  24. c_codelet :: Ptr{Void}
  25. function StarpuCodelet(;
  26. cpu_func :: String = "",
  27. gpu_func :: String = "",
  28. modes :: Vector{StarpuDataAccessMode} = StarpuDataAccessMode[],
  29. perfmodel :: StarpuPerfmodel = StarpuPerfmodel(),
  30. where_to_execute :: Union{Void, UInt32} = nothing
  31. )
  32. if (length(modes) > STARPU_NMAXBUFS)
  33. error("Codelet has too much buffers ($(length(modes)) but only $STARPU_NMAXBUFS are allowed)")
  34. end
  35. real_c_codelet_ptr = @starpucall jlstarpu_new_codelet Ptr{Void} ()
  36. push!(jlstarpu_allocated_structures, real_c_codelet_ptr)
  37. if (where_to_execute == nothing)
  38. real_where = ((cpu_func != "") * STARPU_CPU) | ((gpu_func != "") * STARPU_CUDA)
  39. else
  40. real_where = where_to_execute
  41. end
  42. output = new(real_where, cpu_func, gpu_func, modes, perfmodel, real_c_codelet_ptr)
  43. starpu_c_codelet_update(output)
  44. return output
  45. end
  46. end
  47. function starpu_c_codelet_update(cl :: StarpuCodelet)
  48. translating_cl = StarpuCodeletTranslator(cl)
  49. @starpucall(jlstarpu_codelet_update,
  50. Void, (Ptr{Void}, Ptr{Void}),
  51. Ref{StarpuCodeletTranslator}(translating_cl),
  52. cl.c_codelet
  53. )
  54. end
  55. function load_starpu_function_pointer(func_name :: String)
  56. if (isempty(func_name))
  57. return C_NULL
  58. end
  59. func_pointer = Libdl.dlsym(starpu_tasks_library_handle, func_name)
  60. if (func_pointer == C_NULL)
  61. error("Couldn't find function symbol $func_name into extern library file $starpu_tasks_library")
  62. end
  63. return func_pointer
  64. end
  65. mutable struct StarpuCodeletTranslator
  66. where_to_execute :: UInt32
  67. cpu_func :: Ptr{Void}
  68. cpu_func_name :: Cstring
  69. gpu_func :: Ptr{Void}
  70. nbuffers :: Cint
  71. modes :: Ptr{Void}
  72. perfmodel :: Ptr{Void}
  73. function StarpuCodeletTranslator(cl :: StarpuCodelet)
  74. output = new()
  75. if (iszero(cl.where_to_execute))
  76. error("StarpuCodelet field \"where_to_execute\" is empty")
  77. end
  78. output.where_to_execute = cl.where_to_execute
  79. cpu_func_ptr = load_starpu_function_pointer(cl.cpu_func)
  80. gpu_func_ptr = load_starpu_function_pointer(cl.gpu_func)
  81. if (cpu_func_ptr == C_NULL && gpu_func_ptr == C_NULL)
  82. error("No function specified inside codelet")
  83. end
  84. output.cpu_func = cpu_func_ptr
  85. output.cpu_func_name = Cstring_from_String(cl.cpu_func)
  86. output.gpu_func = gpu_func_ptr
  87. output.nbuffers = Cint(length(cl.modes))
  88. output.modes = pointer(cl.modes)
  89. output.perfmodel = cl.perfmodel.c_perfmodel
  90. return output
  91. end
  92. end