This is the mail archive of the newlib@sourceware.org mailing list for the newlib project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] nvptx newlib port


The attached patch adds a nvptx port to newlib. At present, the nvptx
target is comprised of a family of Nvidia GPUs with compute capability
sm_30 and above. The primary use of newlib on nvptx targets is for use
with OpenACC and OpenMP GPU offloading with GCC. For the past couple of
years, Mentor Graphics has been maintaining a newlib port for nvptx here
<https://github.com/MentorEmbedded/nvptx-newlib>.

There are a couple of quirks with nvptx. Unlike traditional processors,
nvptx targets a text-based virtual instruction set known as PTX. For
starters, PTX does not support "circular references" where an array is
initialized with a value consisting of an offset to itself. This happens
in newlib/libc/reent/impure.c:impure_data. To get around that problem,
newlib needs to be configured with --enable-newlib-global-stdio-streams.
In practice that's fine because those stdio stream are only used for
standalone (i.e., non-GPU offloading) testing of GCC. The important
debug functions, printf, putchar and puts, have been remapped to PTX's
vprintf. Besides, our original port in github was initializing those
file streams to NULL.

Because Nvidia GPUs are primarily used as offload accelerators, we
didn't spend much time emulating systems calls for the nvptx target. As
such, the nvptx target needs to be configured with
--enable-newlib-elix-level=1. However, I did have to implement some
dummy system calls write, exit, close, lseek and read. You may noticed
that this patch also overrides assert. That's because the PTX JIT chokes
with the call to fiprintf in assert_func. We also overrode the memory
management functions to utilize CUDA's malloc.

Beyond that, the changes in this port are relatively non-invasive. I
compressed the patch because the regenerated configure scripts and
Makefiles made it roughly 260k. The nvptx port first appeared in GCC 5.
The instructions on how to build a GCC toolchain with nvptx offloading
can be found here <https://gcc.gnu.org/wiki/Offloading>. Just be sure to
configure newlib with the aforementioned
--enable-newlib-global-stdio-streams --enable-newlib-elix-level=1
options. We got around those options in the github version of newlib by
hacking the generic newlib code with nvptx-specific workarounds.

Cesar

Attachment: 0001-nvptx-port.patch.bz2
Description: application/bzip


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]