123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338 |
- /* StarPU --- Runtime system for heterogeneous multicore architectures.
- *
- * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria
- *
- * StarPU is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 2.1 of the License, or (at
- * your option) any later version.
- *
- * StarPU is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- *
- * See the GNU Lesser General Public License in COPYING.LGPL for more details.
- */
- #ifndef __STARPU_OPENCL_H__
- #define __STARPU_OPENCL_H__
- #include <starpu_config.h>
- #ifdef STARPU_USE_OPENCL
- #ifndef CL_TARGET_OPENCL_VERSION
- #define CL_TARGET_OPENCL_VERSION 100
- #endif
- #ifdef __APPLE__
- #include <OpenCL/cl.h>
- #else
- #include <CL/cl.h>
- #endif
- #include <assert.h>
- #ifdef __cplusplus
- extern "C"
- {
- #endif
- /**
- @defgroup API_OpenCL_Extensions OpenCL Extensions
- @{
- */
- /**
- Store the OpenCL programs as compiled for the different OpenCL
- devices.
- */
- struct starpu_opencl_program
- {
- /** Store each program for each OpenCL device. */
- cl_program programs[STARPU_MAXOPENCLDEVS];
- };
- /**
- @name Writing OpenCL kernels
- @{
- */
- /**
- Return the OpenCL context of the device designated by \p devid
- in \p context.
- */
- void starpu_opencl_get_context(int devid, cl_context *context);
- /**
- Return the cl_device_id corresponding to \p devid in \p device.
- */
- void starpu_opencl_get_device(int devid, cl_device_id *device);
- /**
- Return the command queue of the device designated by \p devid
- into \p queue.
- */
- void starpu_opencl_get_queue(int devid, cl_command_queue *queue);
- /**
- Return the context of the current worker.
- */
- void starpu_opencl_get_current_context(cl_context *context);
- /**
- Return the computation kernel command queue of the current
- worker.
- */
- void starpu_opencl_get_current_queue(cl_command_queue *queue);
- /**
- Set the arguments of a given kernel. The list of arguments
- must be given as <c>(size_t size_of_the_argument, cl_mem *
- pointer_to_the_argument)</c>. The last argument must be 0. Return the
- number of arguments that were successfully set. In case of failure,
- return the id of the argument that could not be set and \p err is set to
- the error returned by OpenCL. Otherwise, return the number of
- arguments that were set.
- Here an example:
- \code{.c}
- int n;
- cl_int err;
- cl_kernel kernel;
- n = starpu_opencl_set_kernel_args(&err, 2, &kernel, sizeof(foo), &foo, sizeof(bar), &bar, 0);
- if (n != 2) fprintf(stderr, "Error : %d\n", err);
- \endcode
- */
- int starpu_opencl_set_kernel_args(cl_int *err, cl_kernel *kernel, ...);
- /** @} */
- /**
- @name Compiling OpenCL kernels
- Source codes for OpenCL kernels can be stored in a file or in a
- string. StarPU provides functions to build the program executable for
- each available OpenCL device as a cl_program object. This program
- executable can then be loaded within a specific queue as explained in
- the next section. These are only helpers, Applications can also fill a
- starpu_opencl_program array by hand for more advanced use (e.g.
- different programs on the different OpenCL devices, for relocation
- purpose for instance).
- @{
- */
- /**
- Store the contents of the file \p source_file_name in the buffer
- \p opencl_program_source. The file \p source_file_name can be located in the
- current directory, or in the directory specified by the environment
- variable \ref STARPU_OPENCL_PROGRAM_DIR, or
- in the directory <c>share/starpu/opencl</c> of the installation
- directory of StarPU, or in the source directory of StarPU. When the
- file is found, \p located_file_name is the full name of the file as it
- has been located on the system, \p located_dir_name the directory
- where it has been located. Otherwise, they are both set to the empty
- string.
- */
- void starpu_opencl_load_program_source(const char *source_file_name, char *located_file_name, char *located_dir_name, char *opencl_program_source);
- /**
- Similar to function starpu_opencl_load_program_source() but
- allocate the buffers \p located_file_name, \p located_dir_name and
- \p opencl_program_source.
- */
- void starpu_opencl_load_program_source_malloc(const char *source_file_name, char **located_file_name, char **located_dir_name, char **opencl_program_source);
- /**
- Compile the OpenCL kernel stored in the file \p source_file_name
- with the given options \p build_options and store the result in the
- directory <c>$STARPU_HOME/.starpu/opencl</c> with the same filename as
- \p source_file_name. The compilation is done for every OpenCL device,
- and the filename is suffixed with the vendor id and the device id of
- the OpenCL device.
- */
- int starpu_opencl_compile_opencl_from_file(const char *source_file_name, const char *build_options);
- /**
- Compile the OpenCL kernel in the string \p opencl_program_source
- with the given options \p build_options and store the result in the
- directory <c>$STARPU_HOME/.starpu/opencl</c> with the filename \p
- file_name. The compilation is done for every OpenCL device, and the
- filename is suffixed with the vendor id and the device id of the
- OpenCL device.
- */
- int starpu_opencl_compile_opencl_from_string(const char *opencl_program_source, const char *file_name, const char *build_options);
- /**
- Compile the binary OpenCL kernel identified with \p kernel_id.
- For every OpenCL device, the binary OpenCL kernel will be loaded from
- the file
- <c>$STARPU_HOME/.starpu/opencl/\<kernel_id\>.\<device_type\>.vendor_id_\<vendor_id\>_device_id_\<device_id\></c>.
- */
- int starpu_opencl_load_binary_opencl(const char *kernel_id, struct starpu_opencl_program *opencl_programs);
- /**
- Compile an OpenCL source code stored in a file.
- */
- int starpu_opencl_load_opencl_from_file(const char *source_file_name, struct starpu_opencl_program *opencl_programs, const char *build_options);
- /**
- Compile an OpenCL source code stored in a string.
- */
- int starpu_opencl_load_opencl_from_string(const char *opencl_program_source, struct starpu_opencl_program *opencl_programs, const char *build_options);
- /**
- Unload an OpenCL compiled code.
- */
- int starpu_opencl_unload_opencl(struct starpu_opencl_program *opencl_programs);
- /** @} */
- /**
- @name Loading OpenCL kernels
- @{
- */
- /**
- Create a kernel \p kernel for device \p devid, on its computation
- command queue returned in \p queue, using program \p opencl_programs
- and name \p kernel_name.
- */
- int starpu_opencl_load_kernel(cl_kernel *kernel, cl_command_queue *queue, struct starpu_opencl_program *opencl_programs, const char *kernel_name, int devid);
- /**
- Release the given \p kernel, to be called after kernel execution.
- */
- int starpu_opencl_release_kernel(cl_kernel kernel);
- /** @} */
- /**
- @name OpenCL Statistics
- @{
- */
- /**
- Collect statistics on a kernel execution.
- After termination of the kernels, the OpenCL codelet should call this
- function with the event returned by \c clEnqueueNDRangeKernel(), to
- let StarPU collect statistics about the kernel execution (used cycles,
- consumed energy).
- */
- int starpu_opencl_collect_stats(cl_event event);
- /** @} */
- /**
- @name OpenCL Utilities
- @{
- */
- /**
- Return the error message in English corresponding to \p status, an OpenCL
- error code.
- */
- const char *starpu_opencl_error_string(cl_int status);
- /**
- Given a valid error status, print the corresponding error message on
- \c stdout, along with the function name \p func, the filename
- \p file, the line number \p line and the message \p msg.
- */
- void starpu_opencl_display_error(const char *func, const char *file, int line, const char *msg, cl_int status);
- /**
- Call the function starpu_opencl_display_error() with the error
- \p status, the current function name, current file and line number,
- and a empty message.
- */
- #define STARPU_OPENCL_DISPLAY_ERROR(status) starpu_opencl_display_error(__starpu_func__, __FILE__, __LINE__, NULL, status)
- /**
- Call the function starpu_opencl_display_error() and abort.
- */
- static __starpu_inline void starpu_opencl_report_error(const char *func, const char *file, int line, const char *msg, cl_int status)
- {
- starpu_opencl_display_error(func, file, line, msg, status);
- assert(0);
- }
- /**
- Call the function starpu_opencl_report_error() with the error \p
- status, the current function name, current file and line number,
- and a empty message.
- */
- #define STARPU_OPENCL_REPORT_ERROR(status) starpu_opencl_report_error(__starpu_func__, __FILE__, __LINE__, NULL, status)
- /**
- Call the function starpu_opencl_report_error() with \p msg
- and \p status, the current function name, current file and line number.
- */
- #define STARPU_OPENCL_REPORT_ERROR_WITH_MSG(msg, status) starpu_opencl_report_error(__starpu_func__, __FILE__, __LINE__, msg, status)
- /**
- Allocate \p size bytes of memory, stored in \p addr. \p flags must be a valid
- combination of \c cl_mem_flags values.
- */
- cl_int starpu_opencl_allocate_memory(int devid, cl_mem *addr, size_t size, cl_mem_flags flags);
- /**
- Copy \p size bytes from the given \p ptr on RAM \p src_node to the
- given \p buffer on OpenCL \p dst_node. \p offset is the offset, in
- bytes, in \p buffer. if \p event is <c>NULL</c>, the copy is
- synchronous, i.e the queue is synchronised before returning. If not
- <c>NULL</c>, \p event can be used after the call to wait for this
- particular copy to complete. This function returns <c>CL_SUCCESS</c>
- if the copy was successful, or a valid OpenCL error code otherwise.
- The integer pointed to by \p ret is set to <c>-EAGAIN</c> if the
- asynchronous launch was successful, or to 0 if \p event was
- <c>NULL</c>.
- */
- cl_int starpu_opencl_copy_ram_to_opencl(void *ptr, unsigned src_node, cl_mem buffer, unsigned dst_node, size_t size, size_t offset, cl_event *event, int *ret);
- /**
- Copy \p size bytes asynchronously from the given \p buffer on OpenCL
- \p src_node to the given \p ptr on RAM \p dst_node. \p offset is the
- offset, in bytes, in \p buffer. if \p event is <c>NULL</c>, the copy
- is synchronous, i.e the queue is synchronised before returning. If not
- <c>NULL</c>, \p event can be used after the call to wait for this
- particular copy to complete. This function returns <c>CL_SUCCESS</c>
- if the copy was successful, or a valid OpenCL error code otherwise.
- The integer pointed to by \p ret is set to <c>-EAGAIN</c> if the
- asynchronous launch was successful, or to 0 if \p event was
- <c>NULL</c>.
- */
- cl_int starpu_opencl_copy_opencl_to_ram(cl_mem buffer, unsigned src_node, void *ptr, unsigned dst_node, size_t size, size_t offset, cl_event *event, int *ret);
- /**
- Copy \p size bytes asynchronously from byte offset \p src_offset of \p
- src on OpenCL \p src_node to byte offset \p dst_offset of \p dst on
- OpenCL \p dst_node. if \p event is <c>NULL</c>, the copy is
- synchronous, i.e. the queue is synchronised before returning. If not
- <c>NULL</c>, \p event can be used after the call to wait for this
- particular copy to complete. This function returns <c>CL_SUCCESS</c>
- if the copy was successful, or a valid OpenCL error code otherwise.
- The integer pointed to by \p ret is set to <c>-EAGAIN</c> if the
- asynchronous launch was successful, or to 0 if \p event was
- <c>NULL</c>.
- */
- cl_int starpu_opencl_copy_opencl_to_opencl(cl_mem src, unsigned src_node, size_t src_offset, cl_mem dst, unsigned dst_node, size_t dst_offset, size_t size, cl_event *event, int *ret);
- /**
- Copy \p size bytes from byte offset \p src_offset of \p src on \p
- src_node to byte offset \p dst_offset of \p dst on \p dst_node. if \p
- event is <c>NULL</c>, the copy is synchronous, i.e. the queue is
- synchronised before returning. If not <c>NULL</c>, \p event can be
- used after the call to wait for this particular copy to complete. The
- function returns <c>-EAGAIN</c> if the asynchronous launch was
- successfull. It returns 0 if the synchronous copy was successful, or
- fails otherwise.
- */
- cl_int starpu_opencl_copy_async_sync(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t size, cl_event *event);
- /** @} */
- /** @} */
- #ifdef __cplusplus
- }
- #endif
- #endif /* STARPU_USE_OPENCL */
- #endif /* __STARPU_OPENCL_H__ */
|