| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- export StarpuDataAccessMode
- export STARPU_NONE,STARPU_R,STARPU_W,STARPU_RW, STARPU_SCRATCH
- export STARPU_REDUX,STARPU_COMMUTE, STARPU_SSEND, STARPU_LOCALITY
- export STARPU_ACCESS_MODE_MAX
- @enum(StarpuDataAccessMode,
- STARPU_NONE = 0,
- STARPU_R = (1 << 0),
- STARPU_W = (1 << 1),
- STARPU_RW = ((1 << 0) | (1 << 1)),
- STARPU_SCRATCH = (1 << 2),
- STARPU_REDUX = (1 << 3),
- STARPU_COMMUTE = (1 << 4),
- STARPU_SSEND = (1 << 5),
- STARPU_LOCALITY = (1 << 6),
- STARPU_ACCESS_MODE_MAX = (1 << 7)
- )
- export StarpuCodelet
- struct StarpuCodelet
- where_to_execute :: UInt32
- cpu_func :: String
- gpu_func :: String
- modes :: Vector{StarpuDataAccessMode}
- perfmodel :: StarpuPerfmodel
- c_codelet :: Ptr{Void}
- function StarpuCodelet(;
- cpu_func :: String = "",
- gpu_func :: String = "",
- modes :: Vector{StarpuDataAccessMode} = StarpuDataAccessMode[],
- perfmodel :: StarpuPerfmodel = StarpuPerfmodel(),
- where_to_execute :: Union{Void, UInt32} = nothing
- )
- if (length(modes) > STARPU_NMAXBUFS)
- error("Codelet has too much buffers ($(length(modes)) but only $STARPU_NMAXBUFS are allowed)")
- end
- real_c_codelet_ptr = @starpucall jlstarpu_new_codelet Ptr{Void} ()
- push!(jlstarpu_allocated_structures, real_c_codelet_ptr)
- if (where_to_execute == nothing)
- real_where = ((cpu_func != "") * STARPU_CPU) | ((gpu_func != "") * STARPU_CUDA)
- else
- real_where = where_to_execute
- end
- output = new(real_where, cpu_func, gpu_func, modes, perfmodel, real_c_codelet_ptr)
- starpu_c_codelet_update(output)
- return output
- end
- end
- function starpu_c_codelet_update(cl :: StarpuCodelet)
- translating_cl = StarpuCodeletTranslator(cl)
- @starpucall(jlstarpu_codelet_update,
- Void, (Ptr{Void}, Ptr{Void}),
- Ref{StarpuCodeletTranslator}(translating_cl),
- cl.c_codelet
- )
- end
- function load_starpu_function_pointer(func_name :: String)
- if (isempty(func_name))
- return C_NULL
- end
- func_pointer = Libdl.dlsym(starpu_tasks_library_handle, func_name)
- if (func_pointer == C_NULL)
- error("Couldn't find function symbol $func_name into extern library file $starpu_tasks_library")
- end
- return func_pointer
- end
- mutable struct StarpuCodeletTranslator
- where_to_execute :: UInt32
- cpu_func :: Ptr{Void}
- cpu_func_name :: Cstring
- gpu_func :: Ptr{Void}
- nbuffers :: Cint
- modes :: Ptr{Void}
- perfmodel :: Ptr{Void}
- function StarpuCodeletTranslator(cl :: StarpuCodelet)
- output = new()
- if (iszero(cl.where_to_execute))
- error("StarpuCodelet field \"where_to_execute\" is empty")
- end
- output.where_to_execute = cl.where_to_execute
- cpu_func_ptr = load_starpu_function_pointer(cl.cpu_func)
- gpu_func_ptr = load_starpu_function_pointer(cl.gpu_func)
- if (cpu_func_ptr == C_NULL && gpu_func_ptr == C_NULL)
- error("No function specified inside codelet")
- end
- output.cpu_func = cpu_func_ptr
- output.cpu_func_name = Cstring_from_String(cl.cpu_func)
- output.gpu_func = gpu_func_ptr
- output.nbuffers = Cint(length(cl.modes))
- output.modes = pointer(cl.modes)
- output.perfmodel = cl.perfmodel.c_perfmodel
- return output
- end
- end
|