[all-commits] [llvm/llvm-project] d9f033: [libc] Ignore 'errno' on the GPU and support 'atoi'

Joseph Huber via All-commits all-commits at lists.llvm.org
Tue Apr 25 10:42:04 PDT 2023


  Branch: refs/heads/main
  Home:   https://github.com/llvm/llvm-project
  Commit: d9f033146b47ceef94c1f041afcd339ef007279e
      https://github.com/llvm/llvm-project/commit/d9f033146b47ceef94c1f041afcd339ef007279e
  Author: Joseph Huber <jhuber6 at vols.utk.edu>
  Date:   2023-04-25 (Tue, 25 Apr 2023)

  Changed paths:
    M libc/config/gpu/entrypoints.txt
    M libc/config/gpu/headers.txt
    M libc/include/errno.h.def
    M libc/src/errno/libc_errno.cpp
    M libc/src/errno/libc_errno.h

  Log Message:
  -----------
  [libc] Ignore 'errno' on the GPU and support 'atoi'

The 'errno' value is most likely not useful on the GPU and it prevents
us from providing certain functions on the GPU that depend on it, like
`atoi`. This patch makes the necessary changes to support `errno` by
simple replacing it with a consumer class.

Supporting `errno` on the GPU is possible in some aspects. The first
approach would be to use a buffer of shared memory that has enough space
for all threads. Another option would be to change code generation to
support `thread_local` using `address_space(5)` memory allocated at
kernel launch. The former could look like the following, which could be
implemented in a later patch:

```
template <typename T>
using SharedBuffer = T[gpu::MAX_THREADS] [[clang::address_space(3)]];
template <typename T> struct ErrnoSetter {
  constexpr ErrnoSetter(SharedBuffer<T> &storage) : storage(storage) {}
  SharedBuffer<T> &storage;
  void operator=(const T &val) { storage[gpu::get_thread_id()] = val; }
};

static SharedBuffer<int> thread_local_buffer [[clang::loader_uninitialized]];
ErrnoSetter<int> __llvmlibc_internal_errno(thread_local_buffer);
```

Reviewed By: sivachandra

Differential Revision: https://reviews.llvm.org/D149107




More information about the All-commits mailing list