| (libc_gpu_motivation)= | |
| # Motivation and Limitations | |
| ## Motivation | |
| This project aims to provide a large subset of the C standard library to users | |
| of GPU accelerators. We deliberately choose to only implement a subset of the C | |
| library as some features are not expressly useful or easily implemented on the | |
| GPU. This will be discussed further in {ref}`Limitations <libc_gpu_limitations>`. | |
| The main motivation behind this project is to provide the well understood C | |
| library as a firm base for GPU development. | |
| The main idea behind this project is that programming GPUs can be as | |
| straightforward as programming on CPUs. This project aims to validate the GPU as | |
| a more general-purpose target. The implementations here will also enable more | |
| complex implementations of other libraries on the GPU, such as `libc++`. | |
| Host services and C library features are currently provided sparsely by the | |
| different GPU vendors. We wish to provide these functions more completely and | |
| make their implementations available in a common format. This is useful for | |
| targets like OpenMP offloading or SYCL which wish to unify the offloading | |
| toolchain. We also aim to provide these functions in a format compatible with | |
| offloading in `Clang` so that we can treat the C library for the GPU as a | |
| standard static library. | |
| A valuable use for providing C library features on the GPU is for testing. For | |
| this reason we build {ref}`tests on the GPU <libc_gpu_testing>` that can run a unit | |
| test as if it were being run on the CPU. This also helps users port applications | |
| that traditionally were run on the CPU. With this support, we can expand test | |
| coverage for the GPU backend to the existing LLVM C library tests. | |
| (libc_gpu_limitations)= | |
| ## Limitations | |
| We only implement a subset of the standard C library. The GPU does not | |
| currently support thread local variables in all cases, so variables like | |
| `errno` are atomic and global. Furthermore, the GPU under the OpenCL execution | |
| model cannot safely provide a mutex interface. This means that features like | |
| file buffering are not implemented on the GPU. We can also not easily provide | |
| threading features on the GPU due to the execution model so these will be | |
| ignored, as will features like `locale` or `time`. | |