xref: /llvm-project/libc/docs/gpu/motivation.rst (revision 3c64a98180148340ed72aa2c19054ddfbcfa72e1)
1.. _libc_gpu_motivation:
2
3==========================
4Motivation and Limitations
5==========================
6
7.. contents:: Table of Contents
8  :depth: 4
9  :local:
10
11Motivation
12==========
13
14This project aims to provide a large subset of the C standard library to users
15of GPU accelerators. We deliberately choose to only implement a subset of the C
16library as some features are not expressly useful or easily implemented on the
17GPU. This will be discussed further in `Limitations <libc_gpu_limitations>`_.
18The main motivation behind this project is to provide the well understood C
19library as a firm base for GPU development.
20
21The main idea behind this project is that programming GPUs can be as
22straightforward as programming on CPUs. This project aims to validate the GPU as
23a more general-purpose target. The implementations here will also enable more
24complex implementations of other libraries on the GPU, such as ``libc++``.
25
26Host services and C library features are currently provided sparsely by the
27different GPU vendors. We wish to provide these functions more completely and
28make their implementations available in a common format. This is useful for
29targets like OpenMP offloading or SYCL which wish to unify the offloading
30toolchain. We also aim to provide these functions in a format compatible with
31offloading in ``Clang`` so that we can treat the C library for the GPU as a
32standard static library.
33
34A valuable use for providing C library features on the GPU is for testing. For
35this reason we build `tests on the GPU <libc_gpu_testing>`_ that can run a unit
36test as if it were being run on the CPU. This also helps users port applications
37that traditionally were run on the CPU. With this support, we can expand test
38coverage for the GPU backend to the existing LLVM C library tests.
39
40.. _libc_gpu_limitations:
41
42Limitations
43===========
44
45We only implement a subset of the standard C library. The GPU does not
46currently support thread local variables in all cases, so variables like
47``errno`` are atomic and global. Furthermore, the GPU under the OpenCL execution
48model cannot safely provide a mutex interface. This means that features like
49file buffering are not implemented on the GPU. We can also not easily provide
50threading features on the GPU due to the execution model so these will be
51ignored, as will features like ``locale`` or ``time``.
52