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