xref: /libCEED/doc/sphinx/source/gpu.md (revision 860c52db8af7468c4aa0315002403e114198fcba)
1b94bfe40SJeremy L Thompson# GPU Development
2b94bfe40SJeremy L Thompson
3b94bfe40SJeremy L ThompsonRuntime selection of libCEED backends allows users to use CPU backends for easier debugging.
4b94bfe40SJeremy L ThompsonCode that produces correct results with CPU backends will produce correct results on GPU backends, provided that JiT and memory access assumptions of the libCEED API are respected.
5b94bfe40SJeremy L Thompson
6b94bfe40SJeremy L Thompson## JiT Compilation
7b94bfe40SJeremy L Thompson
8b94bfe40SJeremy L ThompsonThe filepath to the user source code is passed in {c:func}`CeedQFunctionCreateInterior` as the `source` argument.
9b94bfe40SJeremy L ThompsonThis filepath should typically be an absolute path to ensure the JiT compilation can locate the source file.
10b94bfe40SJeremy L ThompsonThe filepath may also be relative to a root directory set with {c:func}`CeedAddJitSourceRoot`.
11772da9d1SJeremy L ThompsonThe {c:macro}`CEED_QFUNCTION` macro automatically creates a string with the absolute path stored in the variable `user_loc` for a {c:type}`CeedQFunctionUser` called `user`.
12b94bfe40SJeremy L Thompson
13b94bfe40SJeremy L ThompsonThe entire contents of this file and all locally included files (`#include "foo.h"`) are used during JiT compilation for GPU backends.
14b94bfe40SJeremy L ThompsonInstalled headers (`#include <bar.h>`) are omitted in the source code passed to JiT, but the compilation environment may supply common headers such as `<math.h>`.
15b94bfe40SJeremy L ThompsonThese source file must only contain syntax constructs supported by C99 and all targeted backends (i.e. CUDA for `/gpu/cuda`, OpenCL/SYCL for `/gpu/sycl`, etc.).
16b94bfe40SJeremy L Thompson
17b94bfe40SJeremy L ThompsonAll source files must be at the provided filepath at runtime for JiT to function.
18b94bfe40SJeremy L Thompson
19b94bfe40SJeremy L Thompson## Memory Access
20b94bfe40SJeremy L Thompson
21b94bfe40SJeremy L ThompsonGPU backends require stricter adherence to memory access assumptions, but CPU backends may occasionally report correct results despite violations of memory access assumptions.
22*860c52dbSJeremy L ThompsonBoth `CeedVector` and `CeedQFunctionContext` have read-only and read-write accessors, and `CeedVector` allow write-only access.
23*860c52dbSJeremy L ThompsonRead-only access of `CeedVector` and `CeedQFunctionContext` memory spaces must be respected for proper GPU behavior.
24*860c52dbSJeremy L ThompsonWrite-only access of `CeedVector` memory spaces asserts that all data in the `CeedVector` is invalid until overwritten.
25*860c52dbSJeremy L Thompson
26*860c52dbSJeremy L Thompson`CeedQFunction` assume that all input arrays are read-only and all output arrays are write-only and the {c:type}`CeedQFunctionUser` must adhere to these assumptions, only reading data in the input arrays and fully overwriting the output arrays.
27*860c52dbSJeremy L ThompsonAdditionally, {c:type}`CeedQFunctionUser` have read-write access for `CeedQFunctionContext` data, unless {c:func}`CeedQFunctionSetContextWritable` was used to indicate that read-only access is sufficient.
28*860c52dbSJeremy L Thompson
29b94bfe40SJeremy L ThompsonThe `/cpu/self/memcheck` backends explicitly verify read-only and write-only memory access assumptions.
30b94bfe40SJeremy L Thompson
31