xref: /libCEED/doc/sphinx/source/gpu.md (revision 772da9d1ef76c68d83f0d4aa8de004b0bb9fd100)
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`.
11*772da9d1SJeremy 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.
22b94bfe40SJeremy L ThompsonThe `/cpu/self/memcheck` backends explicitly verify read-only and write-only memory access assumptions.
23b94bfe40SJeremy L Thompson
24